HRESULT InitScene() { HRESULT hr; D3DCAPS9 caps; SetWindowText(hwnd, TITLE); device->GetDeviceCaps(&caps); if( caps.VertexShaderVersion < D3DVS_VERSION(2, 0) || caps.PixelShaderVersion < D3DPS_VERSION(2, 0) ) { MYERROR("This demo requires Shader Model 2.0 capable video card"); return E_FAIL; } palm = new DXObject(device); sandplane = new DXObject(device); waterplane = new DXObject(device); if( !palm->Load("../media/meshes/palm.qm") ) { MYERROR("Could not load palm"); return E_FAIL; } if( !sandplane->CreatePlane(50, 50, 10, 10) ) { MYERROR("Could not create sand plane"); return E_FAIL; } if( !waterplane->CreatePlane(50, 50, 5, 5) ) { MYERROR("Could not create water plane"); return E_FAIL; } waterplane->GenerateTangentFrame(); MYVALID(D3DXLoadMeshFromXA("../media/meshes/sky.X", D3DXMESH_MANAGED, device, NULL, NULL, NULL, NULL, &skymesh)); MYVALID(D3DXCreateCubeTextureFromFileA(device, "../media/textures/sky7.dds", &skytex)); MYVALID(D3DXCreateTextureFromFileA(device, "../media/textures/bark.jpg", &bark)); MYVALID(D3DXCreateTextureFromFileA(device, "../media/textures/leaf.jpg", &leaves)); MYVALID(D3DXCreateTextureFromFileA(device, "../media/textures/sand.jpg", &sand)); MYVALID(D3DXCreateTextureFromFileA(device, "../media/textures/wave2.png", &waves)); MYVALID(DXCreateEffect("../media/shaders/ambient.fx", device, &ambient)); MYVALID(DXCreateEffect("../media/shaders/blinnphong.fx", device, &specular)); MYVALID(DXCreateEffect("../media/shaders/water.fx", device, &water)); MYVALID(DXCreateEffect("../media/shaders/simplebloom.fx", device, &bloom)); MYVALID(DXCreateEffect("../media/shaders/godray.fx", device, &godray)); MYVALID(DXCreateEffect("../media/shaders/sky.fx", device, &skyeffect)); MYVALID(device->CreateTexture(screenwidth, screenheight, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A16B16G16R16F, D3DPOOL_DEFAULT, &refraction, NULL)); MYVALID(device->CreateTexture(screenwidth, screenheight, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A16B16G16R16F, D3DPOOL_DEFAULT, &reflection, NULL)); MYVALID(device->CreateTexture(screenwidth, screenheight, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8, D3DPOOL_DEFAULT, &occluders, NULL)); MYVALID(device->CreateTexture(screenwidth, screenheight, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8, D3DPOOL_DEFAULT, &blurtex, NULL)); MYVALID(device->CreateTexture(screenwidth, screenheight, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &sceneldr, NULL)); MYVALID(device->CreateTexture(screenwidth / 2, screenheight / 2, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &bloomtex1, NULL)); MYVALID(device->CreateTexture(screenwidth / 2, screenheight / 2, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &bloomtex2, NULL)); refraction->GetSurfaceLevel(0, &refractsurf); reflection->GetSurfaceLevel(0, &reflectsurf); occluders->GetSurfaceLevel(0, &occludersurf); blurtex->GetSurfaceLevel(0, &blursurf); sceneldr->GetSurfaceLevel(0, &sceneldrsurf); bloomtex1->GetSurfaceLevel(0, &bloomsurf1); bloomtex2->GetSurfaceLevel(0, &bloomsurf2); D3DVERTEXELEMENT9 elem[] = { { 0, 0, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITIONT, 0 }, { 0, 16, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 }, D3DDECL_END() }; MYVALID(device->CreateVertexDeclaration(elem, &quaddecl)); cameraangle = D3DXVECTOR2(-1.13f * D3DX_PI, 0.55f); return S_OK; }
HRESULT InitScene() { HRESULT hr; D3DVERTEXELEMENT9 elem[] = { { 0, 0, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITIONT, 0 }, { 0, 16, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 }, D3DDECL_END() }; SetWindowText(hwnd, TITLE); MYVALID(D3DXLoadMeshFromX("../media/meshes/box.X", D3DXMESH_MANAGED, device, NULL, NULL, NULL, NULL, &box)); MYVALID(D3DXLoadMeshFromX("../media/meshes/skullocc3.X", D3DXMESH_MANAGED, device, NULL, NULL, NULL, NULL, &skull)); MYVALID(D3DXCreateTextureFromFileA(device, "../media/textures/marble.dds", &texture1)); MYVALID(D3DXCreateTextureFromFileA(device, "../media/textures/wood2.jpg", &texture2)); MYVALID(D3DXCreateTextureFromFileA(device, "../media/textures/crate.jpg", &texture3)); MYVALID(D3DXCreateTextureFromFileA(device, "../media/textures/pcfnoise.bmp", &noise)); MYVALID(device->CreateTexture(SHADOWMAP_SIZE, SHADOWMAP_SIZE, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A32B32G32R32F, D3DPOOL_DEFAULT, &shadowmap, NULL)); MYVALID(device->CreateTexture(SHADOWMAP_SIZE, SHADOWMAP_SIZE, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A32B32G32R32F, D3DPOOL_DEFAULT, &blurRGBA32F, NULL)); MYVALID(device->CreateTexture(SHADOWMAP_SIZE, SHADOWMAP_SIZE, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &sincoeffs, NULL)); MYVALID(device->CreateTexture(SHADOWMAP_SIZE, SHADOWMAP_SIZE, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &coscoeffs, NULL)); MYVALID(device->CreateTexture(SHADOWMAP_SIZE, SHADOWMAP_SIZE, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &blurARGB8, NULL)); MYVALID(device->CreateTexture(800, 512, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &text, NULL)); MYVALID(device->CreateVertexDeclaration(elem, &vertexdecl)); MYVALID(DXCreateEffect("../media/shaders/exponentialshadow.fx", device, &exponential)); MYVALID(DXCreateEffect("../media/shaders/convolutionshadow.fx", device, &convolution)); MYVALID(DXCreateEffect("../media/shaders/varianceshadow.fx", device, &variance)); MYVALID(DXCreateEffect("../media/shaders/expvarianceshadow.fx", device, &expvariance)); MYVALID(DXCreateEffect("../media/shaders/boxblur5x5.fx", device, &boxblur5x5)); MYVALID(DXCreateEffect("../media/shaders/pcfshadow5x5.fx", device, &pcf5x5)); MYVALID(DXCreateEffect("../media/shaders/pcss.fx", device, &pcss)); MYVALID(DXCreateEffect("../media/shaders/irregularpcf.fx", device, &pcfirreg)); DXRenderText( "Use the mouse to rotate the camera and the light\n\n0 - Unfiltered\n1 - PCF (5x5)\n2 - Irregular PCF\n3 - Variance\n" "4 - Convolution\n5 - Exponential\n6 - Exponential variance\n7 - PCSS", text, 800, 512); cameraangle = D3DXVECTOR2(0.78f, 0.78f); lightangle = D3DXVECTOR2(3.2f, 0.85f); DXAABox boxbb; DXAABox skullbb; DXAABox tmpbb; D3DXMATRIX tmp1, tmp2, tmp3; D3DXVECTOR3* vdata; box->LockVertexBuffer(D3DLOCK_READONLY, (void**)&vdata); D3DXComputeBoundingBox(vdata, box->GetNumVertices(), box->GetNumBytesPerVertex(), &boxbb.Min, &boxbb.Max); box->UnlockVertexBuffer(); skull->LockVertexBuffer(D3DLOCK_READONLY, (void**)&vdata); D3DXComputeBoundingBox(vdata, skull->GetNumVertices(), skull->GetNumBytesPerVertex(), &skullbb.Min, &skullbb.Max); skull->UnlockVertexBuffer(); for( int i = 0; i < numobjects; ++i ) { SceneObject& obj = objects[i]; D3DXMatrixScaling(&tmp1, obj.scale.x, obj.scale.y, obj.scale.z); D3DXMatrixRotationYawPitchRoll(&tmp2, obj.angles.x, obj.angles.y, obj.angles.z); D3DXMatrixTranslation(&tmp3, obj.position.x, obj.position.y, obj.position.z); D3DXMatrixMultiply(&obj.world, &tmp1, &tmp2); D3DXMatrixMultiply(&obj.world, &obj.world, &tmp3); if( obj.type == SKULL ) tmpbb = skullbb; else tmpbb = boxbb; tmpbb.TransformAxisAligned(obj.world); scenebb.Add(tmpbb.Min); scenebb.Add(tmpbb.Max); } return S_OK; }
HRESULT InitScene() { HRESULT hr; D3DDISPLAYMODE mode; if( FAILED(hr = direct3d->GetAdapterDisplayMode(0, &mode)) ) { MYERROR("Could not get adapter mode"); return hr; } if( FAILED(hr = direct3d->CheckDeviceFormat( 0, D3DDEVTYPE_HAL, mode.Format, D3DUSAGE_RENDERTARGET, D3DRTYPE_TEXTURE, D3DFMT_A16B16G16R16F)) ) { MYERROR("No floating point rendertarget support"); return hr; } // más depth/stencil-el még müködhet if( FAILED(hr = direct3d->CheckDepthStencilMatch( 0, D3DDEVTYPE_HAL, mode.Format, D3DFMT_A16B16G16R16F, D3DFMT_D24S8)) ) { MYERROR("D3DFMT_A16B16G16R16F does not support D3DFMT_D24S8"); return hr; } D3DVERTEXELEMENT9 elem[] = { { 0, 0, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITIONT, 0 }, { 0, 16, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 }, D3DDECL_END() }; SetWindowText(hwnd, TITLE); MYVALID(D3DXLoadMeshFromX("../media/meshes/skullocc3.X", D3DXMESH_MANAGED, device, NULL, NULL, NULL, NULL, &mesh1)); MYVALID(D3DXLoadMeshFromX("../media/meshes//knot.X", D3DXMESH_MANAGED, device, NULL, NULL, NULL, NULL, &mesh2)); MYVALID(D3DXLoadMeshFromX("../media/meshes//teapot.X", D3DXMESH_MANAGED, device, NULL, NULL, NULL, NULL, &mesh3)); MYVALID(D3DXLoadMeshFromX("../media/meshes/sky.X", D3DXMESH_MANAGED, device, NULL, NULL, NULL, NULL, &skymesh)); mesh = mesh1; //MYVALID(D3DXCreateCubeTextureFromFile(device, "../media/textures/altar.dds", &skytexture)); //MYVALID(D3DXCreateCubeTextureFromFile(device, "../media/textures/altar_rough.dds", &roughspecular)); MYVALID(D3DXCreateCubeTextureFromFile(device, "../media/textures/grace.dds", &skytexture)); MYVALID(D3DXCreateCubeTextureFromFile(device, "../media/textures/grace_rough.dds", &roughspecular)); //MYVALID(D3DXCreateCubeTextureFromFile(device, "../media/textures/beach.dds", &skytexture)); //MYVALID(D3DXCreateCubeTextureFromFile(device, "../media/textures/beach_rough.dds", &roughspecular)); //MYVALID(D3DXCreateCubeTextureFromFile(device, "../media/textures/stpeters.dds", &skytexture)); //MYVALID(D3DXCreateCubeTextureFromFile(device, "../media/textures/stpeters_rough.dds", &roughspecular)); MYVALID(D3DXCreateTextureFromFile(device, "../media/textures/gold.jpg", &texture)); MYVALID(D3DXCreateTextureFromFile(device, "../media/textures/fresnel.png", &fresneltexture)); // downsample & blur textures for( int i = 0; i < 5; ++i ) { MYVALID(device->CreateTexture(screenwidth / (2 << i), screenheight / (2 << i), 1, D3DUSAGE_RENDERTARGET, D3DFMT_A16B16G16R16F, D3DPOOL_DEFAULT, &dstargets[i], NULL)); MYVALID(device->CreateTexture(screenwidth / (2 << i), screenheight / (2 << i), 1, D3DUSAGE_RENDERTARGET, D3DFMT_A16B16G16R16F, D3DPOOL_DEFAULT, &blurtargets[i], NULL)); MYVALID(blurtargets[i]->GetSurfaceLevel(0, &blursurfaces[i])); MYVALID(dstargets[i]->GetSurfaceLevel(0, &dssurfaces[i])); } // star textures (8x 1 MB @ 1080p) for( int i = 0; i < 4; ++i ) { for( int j = 0; j < 2; ++j ) { MYVALID(device->CreateTexture(screenwidth / 4, screenheight / 4, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A16B16G16R16F, D3DPOOL_DEFAULT, &startargets[i][j], NULL)); MYVALID(startargets[i][j]->GetSurfaceLevel(0, &starsurfaces[i][j])); } } // lens flare textures (2x 4 MB @ 1080p) for( int i = 0; i < 2; ++i ) { MYVALID(device->CreateTexture(screenwidth / 2, screenheight / 2, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A16B16G16R16F, D3DPOOL_DEFAULT, &ghosttargets[i], NULL)); MYVALID(ghosttargets[i]->GetSurfaceLevel(0, &ghostsurfaces[i])); } // luminance textures for( int i = 0; i < 4; ++i ) { UINT j = 256 / (4 << (2 * i)); MYVALID(device->CreateTexture(j, j, 1, D3DUSAGE_RENDERTARGET, D3DFMT_R16F, D3DPOOL_DEFAULT, &avglumtargets[i], NULL)); MYVALID(avglumtargets[i]->GetSurfaceLevel(0, &avglumsurfaces[i])); } // adapted luminance textures MYVALID(device->CreateTexture(1, 1, 1, D3DUSAGE_RENDERTARGET, D3DFMT_R16F, D3DPOOL_DEFAULT, &avglumtargets[4], NULL)); MYVALID(device->CreateTexture(1, 1, 1, D3DUSAGE_RENDERTARGET, D3DFMT_R16F, D3DPOOL_DEFAULT, &avglumtargets[5], NULL)); MYVALID(avglumtargets[4]->GetSurfaceLevel(0, &avglumsurfaces[4])); MYVALID(avglumtargets[5]->GetSurfaceLevel(0, &avglumsurfaces[5])); // afterimage textures (2x 4 MB @ 1080p) MYVALID(device->CreateTexture(screenwidth / 2, screenheight / 2, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A16B16G16R16F, D3DPOOL_DEFAULT, &afterimages[0], NULL)); MYVALID(device->CreateTexture(screenwidth / 2, screenheight / 2, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A16B16G16R16F, D3DPOOL_DEFAULT, &afterimages[1], NULL)); MYVALID(afterimages[0]->GetSurfaceLevel(0, &aftersurfaces[0])); MYVALID(afterimages[1]->GetSurfaceLevel(0, &aftersurfaces[1])); // other MYVALID(device->CreateTexture(512, 512, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &text, NULL)); MYVALID(device->CreateTexture(screenwidth, screenheight, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A16B16G16R16F, D3DPOOL_DEFAULT, &scenetarget, NULL)); MYVALID(device->CreateVertexDeclaration(elem, &vertexdecl)); // other MYVALID(scenetarget->GetSurfaceLevel(0, &scenesurface)); MYVALID(DXCreateEffect("../media/shaders/hdreffects.fx", device, &hdreffect)); MYVALID(DXCreateEffect("../media/shaders/hdrfresnel.fx", device, &fresnel)); MYVALID(DXCreateEffect("../media/shaders/sky.fx", device, &skyeffect)); device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); device->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_NONE); device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP); device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP); device->SetSamplerState(1, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); device->SetSamplerState(1, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); device->SetSamplerState(1, D3DSAMP_MIPFILTER, D3DTEXF_NONE); device->SetSamplerState(1, D3DSAMP_ADDRESSU, D3DTADDRESS_BORDER); device->SetSamplerState(1, D3DSAMP_ADDRESSV, D3DTADDRESS_BORDER); device->SetSamplerState(2, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); device->SetSamplerState(2, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); device->SetSamplerState(2, D3DSAMP_MIPFILTER, D3DTEXF_NONE); device->SetSamplerState(2, D3DSAMP_ADDRESSU, D3DTADDRESS_BORDER); device->SetSamplerState(2, D3DSAMP_ADDRESSV, D3DTADDRESS_BORDER); device->SetSamplerState(3, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); device->SetSamplerState(3, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); device->SetSamplerState(3, D3DSAMP_MIPFILTER, D3DTEXF_NONE); device->SetSamplerState(4, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); device->SetSamplerState(4, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); device->SetSamplerState(4, D3DSAMP_MIPFILTER, D3DTEXF_NONE); device->SetSamplerState(5, D3DSAMP_MINFILTER, D3DTEXF_POINT); device->SetSamplerState(5, D3DSAMP_MAGFILTER, D3DTEXF_POINT); device->SetSamplerState(5, D3DSAMP_MIPFILTER, D3DTEXF_NONE); DXRenderText(HELP_TEXT, text, 512, 512); // setup camera D3DXMatrixPerspectiveFovLH(&proj, D3DX_PI / 3, (float)screenwidth / (float)screenheight, 1, 50); D3DXMatrixIdentity(&world); cameraangle = D3DXVECTOR2(0.6f, 0.1f); objectangle = D3DXVECTOR2(0, 0); exposurevelocity = 0; destexposurevelocity = 0; exposure = 0.05f; targetluminance = 0.03f; UpdateText(); return S_OK; }