void VisualizeTextureLevel(LPDIRECT3DTEXTURE9 tex, int level, int x, int y, int w, int h, float gamma) { LPD3DXEFFECT effect = LoadEffect("utils.fx"); if (effect == NULL) return; CGame2D* g2d = Get2D(); effect->SetTexture("g_Image", tex); effect->SetFloat("g_Level", (float) level); effect->SetFloat("g_Gamma", gamma); effect->SetTechnique("TextureLevel"); DX_BEGIN_EFFECT(effect); g2d->DrawRect(x, y, w, h, 0xFFFFFFFF); DX_END_EFFECT(effect); }
static void WaterSimulation(void) { LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9(); device->SetRenderTarget(0, g_pSurfaces[TEX_HEIGHT2]); device->SetDepthStencilSurface(NULL); D3DXHANDLE shader = g_pWaterEffect->GetTechniqueByName("WaterSimulation"); D3DXHANDLE heightmap_current_var = g_pWaterEffect->GetParameterByName(NULL, "heightmap_current"); D3DXHANDLE heightmap_prev_var = g_pWaterEffect->GetParameterByName(NULL, "heightmap_prev"); D3DXHANDLE texturesize_var = g_pWaterEffect->GetParameterByName(NULL, "texture_size"); D3DXHANDLE damping_var = g_pWaterEffect->GetParameterByName(NULL, "fDamping"); Vector4 texturesize; texturesize[0] = 1.0f/(float)g_ImageInfo.m_iWidth; texturesize[1] = 1.0f/(float)g_ImageInfo.m_iHeight; texturesize[2] = (float)g_ImageInfo.m_iWidth; texturesize[3] = (float)g_ImageInfo.m_iHeight; g_pWaterEffect->SetTechnique(shader); g_pWaterEffect->SetTexture(heightmap_prev_var, g_pTextures[TEX_HEIGHT0]); g_pWaterEffect->SetTexture(heightmap_current_var, g_pTextures[TEX_HEIGHT1]); g_pWaterEffect->SetFloat(damping_var, 0.99f); g_pWaterEffect->SetVector(texturesize_var, (D3DXVECTOR4*)&texturesize); g_pWaterEffect->Begin(NULL,0); g_pWaterEffect->BeginPass(0); GutDrawFullScreenQuad_DX9(&g_ImageInfo); g_pWaterEffect->EndPass(); g_pWaterEffect->End(); }
static void AddImpulse(void) { static Vector4 vPosition(0.0f, 0.0f, 0.0f, 0.0f); //Vector4 vDiff = vPosition - g_vPosition; Vector4 vDiff = g_vPosition - vPosition; Vector4 vLength = vDiff.Length(); if ( vLength[0]<2.0f ) return; Vector4 vDir = vDiff / vLength; Vector4 vVec0(vDir[1],-vDir[0], 0.0f, 0.0f); Vector4 vVec1(vDir[0], vDir[1], 0.0f, 0.0f); vPosition = g_vPosition; Vector4 vVec0_old = g_orient_matrix[0]; Vector4 vVec1_old = g_orient_matrix[1]; Vector4 vVec0_new = VectorLerp(vVec0_old, vVec0, 0.2f); Vector4 vVec1_new = VectorLerp(vVec1_old, vVec1, 0.2f); vVec0_new.Normalize(); vVec1_new.Normalize(); Vector4 vVec2_new = Vector3CrossProduct(vVec0_new, vVec1_new); g_orient_matrix.Identity(); g_orient_matrix[0] = vVec0_new; g_orient_matrix[1] = vVec1_new; g_orient_matrix[2] = vVec2_new; LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9(); device->SetRenderTarget(0, g_pSurfaces[TEX_HEIGHT1]); device->SetDepthStencilSurface(NULL); Matrix4x4 view_matrix = g_Control.GetViewMatrix(); Matrix4x4 world_matrix; world_matrix.Scale_Replace(g_fRippleSize, g_fRippleSize, 1.0f); world_matrix[3] = g_vPosition; Matrix4x4 wvp_matrix = g_orient_matrix * world_matrix * view_matrix * g_proj_matrix; D3DXHANDLE shader = g_pWaterEffect->GetTechniqueByName("AddImpulse"); D3DXHANDLE wvp_matrix_var = g_pWaterEffect->GetParameterByName(NULL, "wvp_matrix"); D3DXHANDLE force_var = g_pWaterEffect->GetParameterByName(NULL, "fForce"); g_pWaterEffect->SetTechnique(shader); g_pWaterEffect->SetMatrix(wvp_matrix_var, (D3DXMATRIX *)&wvp_matrix); g_pWaterEffect->SetFloat(force_var, 0.05f); g_pWaterEffect->Begin(NULL, 0); g_pWaterEffect->BeginPass(0); g_Model_DX9.Render(0); g_pWaterEffect->EndPass(); g_pWaterEffect->End(); vPosition = g_vPosition; }
/**----------------------------------------------------------------------------- * 화면 그리기 *------------------------------------------------------------------------------ */ VOID Render() { UINT nPass; /// 후면버퍼와 Z버퍼 초기화 g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(200,200,200), 1.0f, 0 ); g_pd3dDevice->SetRenderState( D3DRS_FILLMODE, g_bWireframe ? D3DFILL_WIREFRAME : D3DFILL_SOLID ); /// 애니메이션 행렬설정 Animate(); /// 렌더링 시작 if( SUCCEEDED( g_pd3dDevice->BeginScene() ) ) { if( g_bUseVS ) // 정점 쉐이더를 사용하여 출력? { g_pEffect->SetFloat( "g_fTime", (float)(timeGetTime()) / 100 ); /// 정점선언값과 정점 설정 g_pd3dDevice->SetVertexDeclaration( g_pDecl ); g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(MYVERTEX) ); /// fx출력에 사용할 테크닉 선정 g_pEffect->SetTechnique( "MyShader" ); /// fx를 사용한 출력개시 g_pEffect->Begin( &nPass, D3DXFX_DONOTSAVESTATE ); /// PASS 개수만큼 출력 for( int i = 0; i < nPass ; i++ ) { g_pEffect->BeginPass( i ); g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 1 ); g_pEffect->EndPass(); } /// fx를 사용한 출력종료 g_pEffect->End(); } else { // fx를 사용한뒤에는 이 값을 NULL로 해야 D3D고정 파이프라인을 사용할 수 있다. g_pd3dDevice->SetVertexShader( NULL ); g_pd3dDevice->SetPixelShader( NULL ); g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(MYVERTEX) ); g_pd3dDevice->SetFVF( MYVERTEX::FVF ); g_pd3dDevice->SetTexture( 0, g_pTexture ); g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE ); /// MODULATE연산으로 색깔을 섞음 g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); /// 첫번째 섞을색은 텍스쳐 색 g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE ); /// 두번째 섞을색은 정점 색 g_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_DISABLE ); /// alpha연산은 사용하지 않음 g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 1 ); } g_pd3dDevice->EndScene(); } /// 후면버퍼를 보이는 화면으로! g_pd3dDevice->Present( NULL, NULL, NULL, NULL ); }
void MaskTextureLevel(LPDIRECT3DTEXTURE9 tex, int level, int x, int y, int w, int h, float minMask, float maxMask, int maskValue) { LPD3DXEFFECT effect = LoadEffect("utils.fx"); if (effect == NULL) return; CGame2D* g2d = Get2D(); effect->SetTexture("g_Image", tex); effect->SetFloat("g_Level", (float) level); effect->SetFloat("g_MinMask", minMask); effect->SetFloat("g_MaxMask", maxMask); effect->SetInt("g_Mask", maskValue); effect->SetTechnique("MaskTexture"); DX_BEGIN_EFFECT(effect); g2d->DrawRect(x, y, w, h, 0xFFFFFFFF); DX_END_EFFECT(effect); }
void VCND3D9_SelectionFX::SetSelectionState( LPD3DXEFFECT pShader, const VCNEffectParamSet& params ) { HRESULT hr; float f = params.GetFloat(VCNTXT("Selected")); hr = pShader->SetFloat( mSelected, f); VCN_ASSERT( SUCCEEDED(hr) ); }
static void RenderParticle(void) { LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9(); int w, h; GutGetWindowSize(w, h); Matrix4x4 wvp_matrix = g_Control.GetObjectMatrix() * g_Control.GetViewMatrix() * g_proj_matrix; Vector4 ScreenSize( (float)w, (float)h, 0.0f, 0.0f); float fTanW = FastMath::Tan( FastMath::DegToRad(g_fFOV) ); device->SetRenderTarget(0, g_pMainFramebuffer); device->SetDepthStencilSurface(g_pMainDepthbuffer); device->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER|D3DCLEAR_STENCIL, 0x0, 1.0f, 0); D3DXHANDLE shader = g_pParticleRenderFX->GetTechniqueByName("RenderParticle"); D3DXHANDLE positiontex_var = g_pParticleRenderFX->GetParameterByName(NULL, "PositionTex"); D3DXHANDLE velocitytex_var = g_pParticleRenderFX->GetParameterByName(NULL, "VelocityTex"); D3DXHANDLE wvp_matrix_var = g_pParticleRenderFX->GetParameterByName(NULL, "wvp_matrix"); D3DXHANDLE tan_fov_var = g_pParticleRenderFX->GetParameterByName(NULL, "fTanW"); D3DXHANDLE screensize_var = g_pParticleRenderFX->GetParameterByName(NULL, "ScreenSize"); D3DXHANDLE diffusetex_var = g_pParticleRenderFX->GetParameterByName(NULL, "DiffuseTex"); g_pParticleRenderFX->SetTechnique(shader); g_pParticleRenderFX->SetTexture(positiontex_var, g_pTextures[TEX_POSITION1]); g_pParticleRenderFX->SetTexture(velocitytex_var, g_pTextures[TEX_VELOCITY1]); g_pParticleRenderFX->SetMatrix(wvp_matrix_var, (D3DXMATRIX*)&wvp_matrix); g_pParticleRenderFX->SetVector(screensize_var, (D3DXVECTOR4*)&ScreenSize); g_pParticleRenderFX->SetFloat(tan_fov_var, fTanW); g_pParticleRenderFX->SetTexture(diffusetex_var, g_pParticleTexture); int num_processed_particles = (g_num_particles / g_texture_width) * g_texture_width; if ( num_processed_particles ) { device->SetFVF(D3DFVF_TEX1); g_pParticleRenderFX->Begin(NULL,0); g_pParticleRenderFX->BeginPass(0); //device->SetRenderState(D3DRS_POINTSPRITEENABLE, TRUE); device->DrawPrimitiveUP(D3DPT_POINTLIST, num_processed_particles, g_pParticleArray, sizeof(sParticle)); //device->SetRenderState(D3DRS_POINTSPRITEENABLE, FALSE); g_pParticleRenderFX->EndPass(); g_pParticleRenderFX->End(); } }
static void RenderWater(void) { LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9(); D3DXHANDLE shader = g_pWaterEffect->GetTechniqueByName("Water"); D3DXHANDLE normalmap_var = g_pWaterEffect->GetParameterByName(NULL, "NormalmapTex"); D3DXHANDLE watermap_var = g_pWaterEffect->GetParameterByName(NULL, "WaterTex"); D3DXHANDLE texcoordscale_var = g_pWaterEffect->GetParameterByName(NULL, "fTexcoordScale"); g_pWaterEffect->SetTechnique(shader); g_pWaterEffect->SetTexture(normalmap_var, g_pTextures[TEX_NORMAL]); g_pWaterEffect->SetTexture(watermap_var, g_pWaterTexture); g_pWaterEffect->SetFloat(texcoordscale_var, 0.2f); g_pWaterEffect->Begin(NULL,0); g_pWaterEffect->BeginPass(0); GutDrawFullScreenQuad_DX9(&g_ImageInfo); g_pWaterEffect->EndPass(); g_pWaterEffect->End(); }
//--------------------------------------------------------------------------------------- // マテリアル設定(&コミット) //--------------------------------------------------------------------------------------- void SetMaterialShader(D3DMATERIAL9* pMaterial, LPDIRECT3DTEXTURE9 pTexture) { if (pMaterial) { g_pFX->SetVector(g_hDiffuse, (LPD3DXVECTOR4)&pMaterial->Diffuse); g_pFX->SetVector(g_hSpecular, (LPD3DXVECTOR4)&pMaterial->Specular); g_pFX->SetFloat(g_hPower, pMaterial->Power); g_pFX->SetVector(g_hAmbient, (LPD3DXVECTOR4)&pMaterial->Ambient); } if (pTexture) { g_pFX->SetTexture(g_hTexture, pTexture); g_pFX->SetBool(g_hTexEnable, TRUE); } else { g_pFX->SetBool(g_hTexEnable, FALSE); } g_pFX->CommitChanges(); }
static void HeightmapToNormal(void) { LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9(); device->SetRenderTarget(0, g_pSurfaces[TEX_NORMAL]); device->SetDepthStencilSurface(NULL); D3DXHANDLE shader = g_pWaterEffect->GetTechniqueByName("ConvertNormal"); D3DXHANDLE heightmap_current_var = g_pWaterEffect->GetParameterByName(NULL, "heightmap_current"); D3DXHANDLE normalscale_var = g_pWaterEffect->GetParameterByName(NULL, "fNormalScale"); g_pWaterEffect->SetTechnique(shader); g_pWaterEffect->SetTexture(heightmap_current_var, g_pTextures[TEX_HEIGHT2]); g_pWaterEffect->SetFloat(normalscale_var, 1.0f); g_pWaterEffect->Begin(NULL,0); g_pWaterEffect->BeginPass(0); GutDrawFullScreenQuad_DX9(&g_ImageInfo); g_pWaterEffect->EndPass(); g_pWaterEffect->End(); }
//************************************************************************************************************* void AdaptLuminance(float dt) { char othertex = 4 + (5 - adapttex); // adapt luminance with time into other 1x1 texture (ping-pong them) device->SetRenderTarget(0, avglumsurfaces[othertex]); device->SetTexture(0, avglumtargets[adapttex]); // old adapted luminance device->SetTexture(1, avglumtargets[3]); // result of MeasureLuminance() hdreffect->SetTechnique("adaptluminance"); hdreffect->SetFloat("elapsedtime", dt); hdreffect->Begin(NULL, 0); hdreffect->BeginPass(0); { device->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 2, tmpvert, sizeof(D3DXVECTOR4) + sizeof(D3DXVECTOR2)); } hdreffect->EndPass(); hdreffect->End(); device->SetTexture(5, avglumtargets[othertex]); adapttex = othertex; }
HRESULT CGlowEffect::Render(float fGlowThreshold, float fGlowAmount, bool bUseAlpha) { //#ifdef _DEBUG // bUseAlpha = true; //#endif HRESULT hr=S_OK; LPDIRECT3DDEVICE9 pd3dDevice = CGlobals::GetRenderDevice(); // get current render target m_pBackBuffer = CGlobals::GetDirectXEngine().GetRenderTarget(); if(FAILED(pd3dDevice->GetDepthStencilSurface(&m_pZBuffer))) return E_FAIL; if(!m_pBackBuffer || !m_pZBuffer) return E_FAIL; // Copy scene to lower resolution render target texture if( FAILED(hr = pd3dDevice->StretchRect( m_pBackBuffer, NULL, m_pRTHalfSizeSurface, NULL, D3DTEXF_LINEAR )) ) { OUTPUT_LOG("StretchRect() failed!\r\n"); return hr; } EffectManager* pEffectManager = CGlobals::GetEffectManager(); pEffectManager->BeginEffect(TECH_FULL_SCREEN_GLOW); CEffectFile* pEffectFile = pEffectManager->GetCurrentEffectFile(); if(pEffectFile != 0 && pEffectFile->begin(true, 0)) { // full screen glow effect is completed in four steps. assert(pEffectFile->totalPasses() == 4); mesh_vertex_plain quadVertices[4] = { {Vector3(-1,-1,0), Vector2(0,1)}, { Vector3(1, -1, 0), Vector2(1, 1) }, { Vector3(-1, 1, 0), Vector2(0, 0) }, { Vector3(1, 1, 0), Vector2(1, 0) }, }; // offset the texture coordinate by half texel in order to match texel to pixel. // This takes me hours to figure out. :-( float fhalfTexelWidth = 0.5f/m_glowtextureWidth; float fhalfTexelHeight = 0.5f/m_glowtextureHeight; for (int i=0;i<4;++i) { quadVertices[i].uv.x += fhalfTexelWidth; quadVertices[i].uv.y += fhalfTexelHeight; } // shader constants /* #ifdef TEST_GLOW static int i=0; ++i; if(i>30){ fGlowAmount = 1.0f; fGlowThreshold = 0.f; if(i>60) i=0; } else { fGlowAmount = 0.f; fGlowThreshold = 1.0f; } #endif*/ /* pEffectFile->setParameter(CEffectFile::k_ConstVector0, (const float*)&Vector4(1/m_glowtextureWidth, 1/m_glowtextureHeight, 0.0f, 0.0f)); LinearColor glowness = pEffectManager->GetGlowness(); glowness.a = fGlowThreshold; glowness.r *= fGlowAmount; glowness.g *= fGlowAmount; glowness.b *= fGlowAmount; pEffectFile->setParameter(CEffectFile::k_ConstVector1, (const float*)&glowness); */ bUseAlpha = true; if(bUseAlpha) { ////////////////////////////////////////////////////////////////////////// // make the glow source. Multiply texture alpha * RGB to get the glow sources pd3dDevice->SetRenderTarget( 0, m_pRTGlowSourceSurface); pd3dDevice->SetDepthStencilSurface( NULL ); if(pEffectFile->BeginPass(0)) { pEffectFile->setTexture(0, m_pRTHalfSizeTexture); LPD3DXEFFECT fx = pEffectFile->GetDXEffect(); fx->SetFloat(fx->GetParameterByName(NULL,"glowThreshold"),fGlowThreshold); pEffectFile->CommitChanges(); HRESULT hr = RenderDevice::DrawPrimitiveUP( pd3dDevice, RenderDevice::DRAW_PERF_TRIANGLES_MESH, D3DPT_TRIANGLESTRIP,2,quadVertices,sizeof(mesh_vertex_plain)); pEffectFile->EndPass(); } } ////////////////////////////////////////////////////////////////////////// // Blur glow sources in the horizontal axis pd3dDevice->SetRenderTarget( 0, m_pRTBlurHorizSurface ); pd3dDevice->SetDepthStencilSurface( NULL ); // no need to clear alpha channel? // pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, 0x00, 1.0f, 0 ); if(pEffectFile->BeginPass(1)) { SetBlurEffectParameters(1.0f / m_glowtextureWidth,0,fGlowAmount,pEffectFile); pEffectFile->setTexture(0, m_pRTGlowSourceTexture); pEffectFile->CommitChanges(); HRESULT hr = RenderDevice::DrawPrimitiveUP( pd3dDevice, RenderDevice::DRAW_PERF_TRIANGLES_MESH, D3DPT_TRIANGLESTRIP,2,quadVertices,sizeof(mesh_vertex_plain)); pEffectFile->EndPass(); } // set texture 0 to NULL so same texture is never simultaneously a source and render target pEffectFile->setTexture( 0, (LPDIRECT3DTEXTURE9)NULL ); ////////////////////////////////////////////////////////////////////////// // Blur the horizontal blur in the vertical direction pd3dDevice->SetRenderTarget( 0, m_pRTBlurVertSurface ); pd3dDevice->SetDepthStencilSurface( NULL ); // no need to clear alpha channel? // pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, 0x00, 1.0f, 0 ); //fGlowAmount = 2; if(pEffectFile->BeginPass(1)) { //pEffectFile->setTexture( 1, m_pRTBlurHorizTexture ); SetBlurEffectParameters(0,1.0f / m_glowtextureHeight,fGlowAmount,pEffectFile); pEffectFile->setTexture(0, m_pRTBlurHorizTexture ); //editor here!!! pEffectFile->CommitChanges(); HRESULT hr = RenderDevice::DrawPrimitiveUP( pd3dDevice, RenderDevice::DRAW_PERF_TRIANGLES_MESH, D3DPT_TRIANGLESTRIP,2,quadVertices,sizeof(mesh_vertex_plain)); pEffectFile->EndPass(); } // Set all textures to NULL to prevent RTT being bound as source and destination at the same time, pEffectFile->setTexture( 0,(LPDIRECT3DTEXTURE9)NULL ); ////////////////////////////////////////////////////////////////////////// // Add the final blur image to the back buffer pd3dDevice->SetRenderTarget( 0, m_pBackBuffer); pd3dDevice->SetDepthStencilSurface( NULL ); // no need to clear alpha channel? // pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, 0x00, 1.0f, 0 ); for (int i=0;i<4;++i) { quadVertices[i].uv.x -= fhalfTexelWidth * 0.5f; quadVertices[i].uv.y -= fhalfTexelHeight * 0.5f; } if(pEffectFile->BeginPass(3)) { pEffectFile->setTexture(0, m_pRTHalfSizeTexture ); pEffectFile->setTexture(1,m_pRTBlurVertTexture); Vector4 glowParam = pEffectManager->GetGlowness(); LPD3DXEFFECT fx = pEffectFile->GetDXEffect(); fx->SetVector(fx->GetParameterByName(NULL,"glowParams"), (const DeviceVector4*)&glowParam); pEffectFile->CommitChanges(); HRESULT hr = RenderDevice::DrawPrimitiveUP( pd3dDevice, RenderDevice::DRAW_PERF_TRIANGLES_MESH, D3DPT_TRIANGLESTRIP,2,quadVertices,sizeof(mesh_vertex_plain)); pEffectFile->EndPass(); pEffectFile->setTexture( 0, (LPDIRECT3DTEXTURE9)NULL ); pEffectFile->setTexture(1,(LPDIRECT3DTEXTURE9)NULL); } // restore depth stencil buffer pd3dDevice->SetDepthStencilSurface( m_pZBuffer ); pEffectFile->end(); } else { CGlobals::GetScene()->EnableFullScreenGlow(false); //Glow effect will not be load when graphics setting set to middle //so we just disable this warnning //OUTPUT_LOG("can not set full screen glow effect error \r\n"); } SAFE_RELEASE(m_pZBuffer); return hr; }
//************************************************************************************************************* void Render(float alpha, float elapsedtime) { LPDIRECT3DSURFACE9 oldtarget = NULL; D3DXMATRIX vp, inv, tmp1, tmp2; D3DXVECTOR3 axis(0, 1, 0); D3DXVECTOR3 eye(0, 0, -5); D3DXVECTOR3 look(0, 0, 0); D3DXVECTOR3 up(0, 1, 0); D3DXVECTOR2 cangle = cameraangle.smooth(alpha); D3DXVECTOR2 oangle = objectangle.smooth(alpha); float expo = exposure.smooth(alpha); D3DXMatrixRotationYawPitchRoll(&world, cangle.x, cangle.y, 0); D3DXVec3TransformCoord(&eye, &eye, &world); D3DXMatrixLookAtLH(&view, &eye, &look, &up); D3DXMatrixMultiply(&vp, &view, &proj); D3DXMatrixInverse(&inv, NULL, &view); memcpy(&eye, inv.m[3], 3 * sizeof(float)); if( mesh == mesh1 ) { // skullocc D3DXMatrixScaling(&world, 0.4f, 0.4f, 0.4f); world._42 = -1.5f; } else if( mesh == mesh2 ) { // knot D3DXMatrixScaling(&world, 0.8f, 0.8f, 0.8f); } else { // teapot D3DXMatrixScaling(&world, 1.5f, 1.5f, 1.5f); } D3DXMatrixRotationYawPitchRoll(&tmp1, oangle.x, oangle.y, 0); D3DXMatrixMultiply(&world, &world, &tmp1); D3DXMatrixInverse(&inv, NULL, &world); fresnel->SetVector("eyePos", (D3DXVECTOR4*)&eye); fresnel->SetMatrix("matWorld", &world); fresnel->SetMatrix("matWorldInv", &inv); fresnel->SetMatrix("matViewProj", &vp); D3DXMatrixScaling(&world, 20, 20, 20); skyeffect->SetMatrix("matWorld", &world); D3DXMatrixIdentity(&world); skyeffect->SetMatrix("matWorldSky", &world); skyeffect->SetMatrix("matViewProj", &vp); memcpy(tmpvert, quadvertices, 36 * sizeof(float)); if( SUCCEEDED(device->BeginScene()) ) { device->SetRenderState(D3DRS_SRGBWRITEENABLE, false); device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP); device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP); // STEP 1: render sky device->GetRenderTarget(0, &oldtarget); if( firstframe ) { device->SetRenderTarget(0, aftersurfaces[0]); device->Clear(0, NULL, D3DCLEAR_TARGET, 0, 1.0f, 0); device->SetRenderTarget(0, aftersurfaces[1]); device->Clear(0, NULL, D3DCLEAR_TARGET, 0, 1.0f, 0); device->SetRenderTarget(0, avglumsurfaces[4]); device->Clear(0, NULL, D3DCLEAR_TARGET, 0x11111111, 1.0f, 0); device->SetRenderTarget(0, avglumsurfaces[5]); device->Clear(0, NULL, D3DCLEAR_TARGET, 0x11111111, 1.0f, 0); firstframe = false; } device->SetRenderTarget(0, scenesurface); device->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, 0xff6694ed, 1.0f, 0); device->SetRenderState(D3DRS_ZENABLE, FALSE); device->SetTexture(0, skytexture); skyeffect->Begin(NULL, 0); skyeffect->BeginPass(0); { skymesh->DrawSubset(0); } skyeffect->EndPass(); skyeffect->End(); device->SetRenderState(D3DRS_ZENABLE, TRUE); // STEP 2: render object device->SetTexture(0, texture); device->SetTexture(1, fresneltexture); device->SetTexture(2, skytexture); device->SetTexture(3, roughspecular); fresnel->Begin(NULL, 0); fresnel->BeginPass(0); { mesh->DrawSubset(0); } fresnel->EndPass(); fresnel->End(); device->SetVertexDeclaration(vertexdecl); // STEP 3: measure average luminance MeasureLuminance(); // STEP 4: adapt luminance to eye AdaptLuminance(elapsedtime); // STEP 5: bright pass BrightPass(); // STEP 6: downsample bright pass texture DownSample(); // STEP 7: blur downsampled textures Blur(); // STEP 8: ghost LensFlare(); // STEP 9: star Star(); // STEP 10: final combine hdreffect->SetTechnique("final"); hdreffect->SetFloat("targetluminance", targetluminance); device->SetRenderTarget(0, oldtarget); device->SetTexture(0, scenetarget); // scene device->SetTexture(1, blurtargets[0]); // blur device->SetTexture(2, blurtargets[1]); // star device->SetTexture(3, ghosttargets[0]); // ghost device->SetTexture(4, afterimages[1 - afterimagetex]); device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP); device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP); device->SetRenderState(D3DRS_SRGBWRITEENABLE, true); oldtarget->Release(); hdreffect->Begin(NULL, 0); hdreffect->BeginPass(0); { device->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 2, quadvertices, sizeof(D3DXVECTOR4) + sizeof(D3DXVECTOR2)); } hdreffect->EndPass(); hdreffect->End(); if( drawhelp ) { // render text device->SetFVF(D3DFVF_XYZRHW|D3DFVF_TEX1); device->SetRenderState(D3DRS_ZENABLE, FALSE); device->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); device->SetTexture(0, text); device->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 2, textvertices, 6 * sizeof(float)); device->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); device->SetRenderState(D3DRS_ZENABLE, TRUE); } // clean up device->SetTexture(1, NULL); device->SetTexture(2, NULL); device->SetTexture(3, NULL); device->SetTexture(4, NULL); device->SetTexture(5, NULL); device->EndScene(); } device->Present(NULL, NULL, NULL, NULL); }
void sc_lights_initSun(SC_SCREEN* screen) { if(sun_color.red == 0 && sun_color.green == 0 && sun_color.blue == 0) return; //create materials screen.materials.sun = mtl_create(); if(screen.settings.lights.sunShadows == 0) effect_load(screen.materials.sun, sc_lights_sMaterialSun); else effect_load(screen.materials.sun, sc_lights_sMaterialSunShadow); screen.materials.sun.skin1 = screen.renderTargets.gBuffer[SC_GBUFFER_NORMALS_AND_DEPTH]; //point to gBuffer: normals and depth //screen.materials.sun.skin2 = ObjData.light.projMap; //projection map //screen.materials.sun.skin3 = ObjData.light.shadowMap; //shadowmap screen.materials.sun.skin4 = screen.renderTargets.gBuffer[SC_GBUFFER_MATERIAL_DATA]; //point to gBuffer: brdf data screen.materials.sun.SC_SKILL = screen; set(screen.materials.sun, ENABLE_VIEW); screen.materials.sun.event = sc_lights_MaterialEventSun; //setup views screen.views.sun = view_create(-997); set(screen.views.sun, PROCESS_TARGET); set(screen.views.sun, UNTOUCHABLE); set(screen.views.sun, NOSHADOW); reset(screen.views.sun, AUDIBLE); set(screen.views.sun, NOPARTICLE); set(screen.views.sun, NOSKY); set(screen.views.sun, CHILD); set(screen.views.sun, NOFLAG1); screen.views.sun.size_x = screen.views.main.size_x; screen.views.sun.size_y = screen.views.main.size_y; screen.views.sun.material = screen.materials.sun; screen.views.sun.bmap = screen.renderTargets.full0; #ifndef SC_A7 //PSSM SHADOWS if(screen.settings.lights.sunShadows == 1) { sun_angle.roll = 1.1*maxv(vec_length(level_ent->max_x),vec_length(level_ent->min_x)); //screen.renderTargets.sunShadowDepth = bmap_createblack(screen.settings.lights.sunShadowResolution, screen.settings.lights.sunShadowResolution, 12222); //screen.materials.sun.skin3 = screen.renderTargets.sunShadowDepth; int i = 0; for(i=0; i<screen.settings.lights.sunPssmSplits; i++) { screen.views.sunShadowDepth[i] = view_create(-800); #ifndef SC_A7 screen.views.sunShadowDepth[i].bg = pixel_for_vec(COLOR_WHITE,0,8888); #endif screen.views.sunShadowDepth[i].lod = shadow_lod; /* //set shadowview flags set(screen.views.sunShadowDepth[i], SHOW); reset(screen.views.sunShadowDepth[i], AUDIBLE); set(screen.views.sunShadowDepth[i], UNTOUCHABLE); set(screen.views.sunShadowDepth[i], NOSHADOW); set(screen.views.sunShadowDepth[i], SHADOW); set(screen.views.sunShadowDepth[i], NOPARTICLE); set(screen.views.sunShadowDepth[i], ISOMETRIC); //set(screen.views.sunShadowDepth[i], CULL_CW); #ifdef SC_USE_NOFLAG1 set(screen.views.sunShadowDepth[i], NOFLAG1); #endif */ screen.views.sunShadowDepth[i]->flags |= SHOW|UNTOUCHABLE|NOSHADOW|NOPARTICLE|NOLOD|NOSKY|ISOMETRIC|SHADOW|NOFLAG1; //create rendertarget screen.renderTargets.sunShadowDepth[i] = bmap_createblack(screen.settings.lights.sunShadowResolution, screen.settings.lights.sunShadowResolution, 14); /* //BLUR SHADOWMAP (ESM SHADOWS ONLY) if(i < screen.settings.lights.sunPssmBlurSplits) { //assign rendertarget //screen.views.sunShadowDepth[i].bmap = screen.renderTargets.sunShadowDepth[i]; screen.views.sunShadowDepth[i].bmap = bmap_createblack(screen.settings.lights.sunShadowResolution, screen.settings.lights.sunShadowResolution, 14); //blur light depthmap VIEW* blurView = view_create(-799); blurView.size_x = screen.settings.lights.sunShadowResolution; blurView.size_y = screen.settings.lights.sunShadowResolution; set(blurView, CHILD); set(blurView, PROCESS_TARGET); screen.views.sunShadowDepth[i].stage = blurView; blurView.bmap = screen.renderTargets.sunShadowDepth[i]; blurView.material = mtl_create(); effect_load(blurView.material, sc_lights_sMaterialShadowmapBlur); //blurView.material.skill1 = floatv((float)(2.25-i)/(float)screen.settings.lights.sunShadowResolution); if(i==0) blurView.material.skill1 = floatv((float)(1.5)/(float)screen.settings.lights.sunShadowResolution); if(i==1) blurView.material.skill1 = floatv((float)(0.75)/(float)screen.settings.lights.sunShadowResolution); if(i==2) blurView.material.skill1 = floatv((float)(0.25)/(float)screen.settings.lights.sunShadowResolution); if(i==3) blurView.material.skill1 = floatv((float)(0.125)/(float)screen.settings.lights.sunShadowResolution); // } else { screen.views.sunShadowDepth[i].bmap = screen.renderTargets.sunShadowDepth[i]; } */ screen.views.sunShadowDepth[i].bmap = screen.renderTargets.sunShadowDepth[i]; //create material screen.views.sunShadowDepth[i].material = mtl_create(); switch(i){ case 0: effect_load(screen.views.sunShadowDepth[i].material,sc_lights_sMaterialShadowmapSplit1); break; case 1: effect_load(screen.views.sunShadowDepth[i].material,sc_lights_sMaterialShadowmapSplit2); break; case 2: effect_load(screen.views.sunShadowDepth[i].material,sc_lights_sMaterialShadowmapSplit3); break; case 3: effect_load(screen.views.sunShadowDepth[i].material,sc_lights_sMaterialShadowmapSplit4); break; default: break; } //pass number of splits to sun shader screen.materials.sun.skill13 = floatv(screen.settings.lights.sunPssmSplits); } if(sc_materials_zbuffer!=NULL){ bmap_purge(sc_materials_zbuffer); ptr_remove(sc_materials_zbuffer); sc_materials_zbuffer=NULL; } sc_materials_zbuffer=bmap_createblack(maxv(screen_size.x,screen.settings.lights.sunShadowResolution),maxv(screen_size.y,screen.settings.lights.sunShadowResolution),32); bmap_zbuffer(sc_materials_zbuffer); //add shadow edge masking + expanding to accelerate pcf shadows //setup views screen.views.sunEdge = view_create(-997); set(screen.views.sunEdge, PROCESS_TARGET); set(screen.views.sunEdge, UNTOUCHABLE); set(screen.views.sunEdge, NOSHADOW); reset(screen.views.sunEdge, AUDIBLE); set(screen.views.sunEdge, NOPARTICLE); set(screen.views.sunEdge, NOSKY); set(screen.views.sunEdge, CHILD|NOFLAG1); screen.views.sunEdge.size_x = screen.views.main.size_x/4; screen.views.sunEdge.size_y = screen.views.main.size_y/4; screen.views.sunEdge.bmap = screen.renderTargets.quarter0;//bmap_createblack(screen.views.main.size_x/4, screen.views.main.size_y/4, 32);//screen.renderTargets.quarter0; screen.views.sunEdge.material = mtl_create(); effect_load(screen.views.sunEdge.material, sc_lights_sMaterialSunShadowEdge); screen.views.sunEdge.material.skin1 = screen.renderTargets.gBuffer[SC_GBUFFER_NORMALS_AND_DEPTH]; screen.views.sunEdge.material.skill8 = floatv(screen.views.main.clip_far); screen.views.sunEdge.material.skill13 = floatv(screen.settings.lights.sunPssmSplits); LPD3DXEFFECT fx = screen.views.sunEdge->material->d3deffect; if(fx) { fx->SetInt("shadowmapSize", (screen.settings.lights.sunShadowResolution) ); fx->SetFloat("shadowBias", (screen.settings.lights.sunShadowBias) ); } set(screen.views.sunEdge.material, ENABLE_VIEW); screen.views.sunEdge.material.event = sc_lights_MaterialEventSun; //expander screen.views.sunExpand = view_create(-997); set(screen.views.sunExpand, PROCESS_TARGET); set(screen.views.sunExpand, UNTOUCHABLE); set(screen.views.sunExpand, NOSHADOW); reset(screen.views.sunExpand, AUDIBLE); set(screen.views.sunExpand, NOPARTICLE); set(screen.views.sunExpand, NOSKY); set(screen.views.sunExpand, CHILD|NOFLAG1); screen.views.sunExpand.size_x = screen.views.main.size_x/8; screen.views.sunExpand.size_y = screen.views.main.size_y/8; screen.views.sunExpand.bmap = screen.renderTargets.eighth0;//bmap_createblack(screen.views.main.size_x/8, screen.views.main.size_y/8, 32);//screen.renderTargets.quarter0; screen.views.sunExpand.material = mtl_create(); effect_load(screen.views.sunExpand.material, sc_lights_sMaterialSunShadowExpand); screen.views.sunExpand.material.skin1 = screen.renderTargets.quarter0; set(screen.views.sunExpand.material, ENABLE_VIEW); screen.views.sunExpand.material.event = sc_lights_MaterialEventSun; //shadow screen.views.sunShadow = view_create(-997); set(screen.views.sunShadow, PROCESS_TARGET); set(screen.views.sunShadow, UNTOUCHABLE); set(screen.views.sunShadow, NOSHADOW); reset(screen.views.sunShadow, AUDIBLE); set(screen.views.sunShadow, NOPARTICLE); set(screen.views.sunShadow, NOSKY); set(screen.views.sunShadow, CHILD|NOFLAG1); screen.views.sunShadow.size_x = screen.views.main.size_x; screen.views.sunShadow.size_y = screen.views.main.size_y; screen.views.sunShadow.bmap = screen.renderTargets.full1;//bmap_createblack(screen.views.main.size_x/4, screen.views.main.size_y/4, 32);//screen.renderTargets.quarter0; screen.views.sunShadow.material = mtl_create(); effect_load(screen.views.sunShadow.material, sc_lights_sMaterialSunShadowCreate); screen.views.sunShadow.material.skin1 = screen.renderTargets.gBuffer[SC_GBUFFER_NORMALS_AND_DEPTH]; screen.views.sunShadow.material.skin2 = screen.renderTargets.eighth0; screen.views.sunShadow.material.skill4 = floatv(screen.views.sunShadowDepth[0].clip_far); screen.views.sunShadow.material.skill8 = floatv(screen.views.main.clip_far); screen.views.sunShadow.material.skill13 = floatv(screen.settings.lights.sunPssmSplits); LPD3DXEFFECT fx = screen.views.sunShadow->material->d3deffect; if(fx) { fx->SetInt("shadowmapSize", (screen.settings.lights.sunShadowResolution) ); fx->SetFloat("shadowBias", (screen.settings.lights.sunShadowBias) ); } set(screen.views.sunShadow.material, ENABLE_VIEW); screen.views.sunShadow.material.event = sc_lights_MaterialEventSun; //set stages screen.views.sunEdge.stage = screen.views.sunExpand; screen.views.sunExpand.stage = screen.views.sunShadow; screen.views.sunShadow.stage = screen.views.sun; } #endif //------------ //apply sun to camera VIEW* view_last; view_last = screen.views.gBuffer; while(view_last.stage != NULL) { view_last = view_last.stage; } #ifndef SC_A7 //PSSM SHADOWS are supported if(screen.settings.lights.sunShadows == 1) { view_last.stage = screen.views.sunEdge; } else { view_last.stage = screen.views.sun; } #else view_last.stage = screen.views.sun; #endif }
void sc_lights_MaterialEventSun() { SC_SCREEN* screen = (SC_SCREEN*)(mtl.SC_SKILL); if(screen == NULL) return; switch(render_view) { case screen.views.sunEdge: screen.views.sunEdge.bmap = screen.renderTargets.quarter0; break; case screen.views.sunExpand: screen.views.sunExpand.bmap = screen.renderTargets.eighth0; break; case screen.views.sunShadow: screen.views.sunShadow.bmap = screen.renderTargets.full1; break; case screen.views.sun: screen.views.sun.bmap = screen.renderTargets.full0; //LPD3DXEFFECT pEffect = (LPD3DXEFFECT)mtl->d3deffect; #ifndef SC_A7 LPD3DXEFFECT pEffect = (LPD3DXEFFECT)mtl->d3deffect; #else LPD3DXEFFECT pEffect = (LPD3DXEFFECT)render_d3dxeffect; #endif //LPD3DXEFFECT pEffect = (LPD3DXEFFECT)(mtl->d3deffect); if(pEffect != NULL) { pEffect->SetVector("frustumPoints", screen.frustumPoints); //pEffect->SetFloat("clipFar", screen.views.main.clip_far); pEffect->SetTexture("texBRDFLut", sc_deferredLighting_texBRDFLUT); //assign volumetric brdf lut pEffect->SetTexture("texMaterialLUT", sc_materials_mapData.d3dtex); pEffect->SetTexture("texShadowMask", screen.renderTargets.eighth0.d3dtex); pEffect->SetTexture("texShadowSun", screen.renderTargets.full1.d3dtex); pEffect->SetInt("shadowmapSize", (screen.settings.lights.sunShadowResolution) ); pEffect->SetFloat("shadowBias", (screen.settings.lights.sunShadowBias) ); } break; default: break; } /* if(render_view == screen.views.sun) { screen.views.sun.bmap = screen.renderTargets.full0; //LPD3DXEFFECT pEffect = (LPD3DXEFFECT)mtl->d3deffect; #ifndef SC_A7 LPD3DXEFFECT pEffect = (LPD3DXEFFECT)mtl->d3deffect; #else LPD3DXEFFECT pEffect = (LPD3DXEFFECT)render_d3dxeffect; #endif //LPD3DXEFFECT pEffect = (LPD3DXEFFECT)(mtl->d3deffect); if(pEffect != NULL) { pEffect->SetVector("frustumPoints", screen.frustumPoints); //pEffect->SetFloat("clipFar", screen.views.main.clip_far); pEffect->SetTexture("texBRDFLut", sc_deferredLighting_texBRDFLUT); //assign volumetric brdf lut pEffect->SetTexture("texMaterialLUT", sc_materials_mapData.d3dtex); pEffect->SetInt("shadowmapSize", (screen.settings.lights.sunShadowResolution) ); pEffect->SetFloat("shadowBias", (screen.settings.lights.sunShadowBias) ); } } */ }
var sc_lights_mtlShadowmapLocalRenderEvent() { //mtl.skill1 = floatv(0); //wind... //mtl.skill2 = floatv(0.5); //depth alpha clip //mtl.skill3 = floatv(0); //shadow bias if(my) { #ifndef SC_A7 LPD3DXEFFECT pEffect = (LPD3DXEFFECT)mtl->d3deffect; #else LPD3DXEFFECT pEffect = (LPD3DXEFFECT)render_d3dxeffect; #endif //mtl.skill2 = floatv(1-(my.alpha/100)); pEffect->SetFloat("alphaClip", 1-(my.alpha/100)); pEffect->SetFloat("clipFar", mtl.skill30); if(my.SC_SKILL) { SC_OBJECT* ObjData = (SC_OBJECT*)(my.SC_SKILL); //if(ObjData == NULL) return(1); //mtl.skill3 = floatv(ObjData.shadowBias); //check if object casts local shadows if(ObjData.castShadow == 2 || ObjData.castShadow == 3) { #ifndef SC_A7 //check if object has specific shadowmap material applied if(ObjData.material.shadowmap != NULL) { //Set basic shadowmap parameters for new material LPD3DXEFFECT pEffect2 = (LPD3DXEFFECT)(ObjData.material.shadowmap->d3deffect); if(pEffect2) { pEffect2->SetFloat("alphaClip", 1-(my.alpha/100)); pEffect2->SetFloat("clipFar", mtl.skill30); } //change current material to new one mtl = ObjData.material.shadowmap; //get material skills from object material mtl.skill1 = my.material.skill1; mtl.skill2 = my.material.skill2; mtl.skill3 = my.material.skill3; mtl.skill4 = my.material.skill4; mtl.skill5 = my.material.skill5; mtl.skill6 = my.material.skill6; mtl.skill7 = my.material.skill7; mtl.skill8 = my.material.skill8; mtl.skill9 = my.material.skill9; mtl.skill10 = my.material.skill10; mtl.skill11 = my.material.skill11; mtl.skill12 = my.material.skill12; mtl.skill13 = my.material.skill13; mtl.skill14 = my.material.skill14; mtl.skill15 = my.material.skill15; mtl.skill16 = my.material.skill16; mtl.skill17 = my.material.skill17; mtl.skill18 = my.material.skill18; mtl.skill19 = my.material.skill19; mtl.skill20 = my.material.skill20; } #endif //ptr_remove(screen); return(0); } } else { return (0); } //free(screen); } return(1); }
HRESULT InitScene() { HRESULT hr; SetWindowText(hwnd, TITLE); MYVALID(D3DXCreateTextureFromFileA(device, "../media/textures/marble.dds", &texture1)); MYVALID(D3DXCreateTextureFromFileA(device, "../media/textures/wood2.jpg", &texture2)); MYVALID(DXCreateEffect("../media/shaders/ambient.fx", device, &ambient)); MYVALID(DXCreateEffect("../media/shaders/blinnphong.fx", device, &specular)); MYVALID(DXCreateEffect("../media/shaders/extrude.fx", device, &extrude)); MYVALID(device->CreateTexture(512, 128, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &text, NULL)); MYVALID(DXCreateTexturedBox(device, D3DXMESH_MANAGED, &shadowreceiver)); // box MYVALID(DXCreateTexturedBox(device, D3DXMESH_MANAGED, &objects[0].object)); MYVALID(DXCreateCollisionBox(device, D3DXMESH_SYSTEMMEM, &objects[0].caster)); D3DXMatrixTranslation(&objects[0].world, -1.5f, 0.55f, 1.2f); MYVALID(device->CreateVertexBuffer(VOLUME_NUMVERTICES(objects[0].caster->GetNumVertices()) * sizeof(D3DXVECTOR4), D3DUSAGE_DYNAMIC, D3DFVF_XYZW, D3DPOOL_DEFAULT, &objects[0].vertices, NULL)); MYVALID(device->CreateIndexBuffer(VOLUME_NUMINDICES(objects[0].caster->GetNumFaces()) * sizeof(WORD), D3DUSAGE_DYNAMIC, D3DFMT_INDEX16, D3DPOOL_DEFAULT, &objects[0].indices, NULL)); // sphere MYVALID(DXCreateTexturedSphere(device, 0.5f, 30, 30, D3DXMESH_SYSTEMMEM, &objects[1].object)); MYVALID(DXCreateCollisionSphere(device, 0.5f, 30, 30, D3DXMESH_SYSTEMMEM, &objects[1].caster)); D3DXMatrixTranslation(&objects[1].world, 1.0f, 0.55f, 0.7f); MYVALID(device->CreateVertexBuffer(VOLUME_NUMVERTICES(objects[1].caster->GetNumVertices()) * sizeof(D3DXVECTOR4), D3DUSAGE_DYNAMIC, D3DFVF_XYZW, D3DPOOL_DEFAULT, &objects[1].vertices, NULL)); MYVALID(device->CreateIndexBuffer(VOLUME_NUMINDICES(objects[1].caster->GetNumFaces()) * sizeof(WORD), D3DUSAGE_DYNAMIC, D3DFMT_INDEX16, D3DPOOL_DEFAULT, &objects[1].indices, NULL)); // L shape MYVALID(DXCreateTexturedLShape(device, D3DXMESH_MANAGED, &objects[2].object)); MYVALID(DXCreateCollisionLShape(device, D3DXMESH_SYSTEMMEM, &objects[2].caster)); D3DXMatrixTranslation(&objects[2].world, 0, 0.55f, -1); MYVALID(device->CreateVertexBuffer(VOLUME_NUMVERTICES(objects[2].caster->GetNumVertices()) * sizeof(D3DXVECTOR4), D3DUSAGE_DYNAMIC, D3DFVF_XYZW, D3DPOOL_DEFAULT, &objects[2].vertices, NULL)); MYVALID(device->CreateIndexBuffer(VOLUME_NUMINDICES(objects[2].caster->GetNumFaces()) * sizeof(WORD), D3DUSAGE_DYNAMIC, D3DFMT_INDEX16, D3DPOOL_DEFAULT, &objects[2].indices, NULL)); #if 0 D3DXMATERIAL defmat; defmat.pTextureFilename = 0; defmat.MatD3D.Ambient = D3DXCOLOR(1, 1, 1, 1); defmat.MatD3D.Diffuse = D3DXCOLOR(1, 1, 1, 1); defmat.MatD3D.Specular = D3DXCOLOR(1, 1, 1, 1); defmat.MatD3D.Emissive = D3DXCOLOR(0, 0, 0, 0); defmat.MatD3D.Power = 20; DXSaveMeshToQM("../media/meshes10/box.qm", objects[0].object, &defmat, 1); DXSaveMeshToQM("../media/meshes10/collisionbox.qm", objects[0].caster, &defmat, 1); DXSaveMeshToQM("../media/meshes10/sphere.qm", objects[1].object, &defmat, 1); DXSaveMeshToQM("../media/meshes10/collisionsphere.qm", objects[1].caster, &defmat, 1); DXSaveMeshToQM("../media/meshes10/lshape.qm", objects[2].object, &defmat, 1); DXSaveMeshToQM("../media/meshes10/collisionlshape.qm", objects[2].caster, &defmat, 1); #endif // generate edges std::cout << "Generating edge info...\n"; for( int i = 0; i < NUM_OBJECTS; ++i ) GenerateEdges(objects[i].edges, objects[i].caster); // shadow volume decl D3DVERTEXELEMENT9 elem[] = { { 0, 0, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 }, D3DDECL_END() }; MYVALID(device->CreateVertexDeclaration(elem, &shadowdecl)); // effect specular->SetFloat("ambient", 0); cameraangle = D3DXVECTOR2(0.78f, 0.78f); lightangle = D3DXVECTOR2(2.8f, 0.78f); DXRenderText("Use mouse to rotate camera and light\n\n1: draw silhouette\n2: draw shadow volume", text, 512, 128); return S_OK; }
void RenderLightShafts(const D3DXMATRIX& view, const D3DXMATRIX& proj, const D3DXVECTOR3& eye, const D3DXVECTOR4& lightpos) { D3DXMATRIX world; D3DXVECTOR3 viewdir(view._13, view._23, view._33); D3DXVECTOR3 lightdir; D3DXVECTOR4 lightss; D3DXVECTOR4 texelsize(1.0f / screenwidth, 1.0f / screenheight, 0, 1); D3DXVec3Normalize(&lightdir, (D3DXVECTOR3*)&lightpos); float exposure = min(max(D3DXVec3Dot(&viewdir, &lightdir), 0), 1); lightss.x = eye.x + lightpos.x; lightss.y = eye.y + lightpos.y; lightss.z = eye.z + lightpos.z; lightss.w = 1; D3DXVec4Transform(&lightss, &lightss, &view); D3DXVec4Transform(&lightss, &lightss, &proj); lightss.x = (1.0f + lightss.x / lightss.w) * 0.5f; lightss.y = (1.0f - lightss.y / lightss.w) * 0.5f; device->SetRenderTarget(0, occludersurf); device->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, 0x68686868, 1.0f, 0); D3DXMatrixScaling(&world, 6, 6, 6); world._42 = -2; device->SetTransform(D3DTS_WORLD, &world); device->SetTransform(D3DTS_VIEW, &view); device->SetTransform(D3DTS_PROJECTION, &proj); palm->DrawSubset(0, DXObject::Opaque); palm->DrawSubset(1, DXObject::Opaque); device->SetVertexDeclaration(quaddecl); device->SetRenderState(D3DRS_ZENABLE, FALSE); // first blur godray->SetTechnique("godray"); godray->SetVector("lightPos", (D3DXVECTOR4*)&lightss); godray->SetFloat("exposure", exposure); device->SetRenderTarget(0, blursurf); godray->Begin(0, 0); godray->BeginPass(0); { device->SetTexture(0, occluders); device->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 2, quadvertices, 6 * sizeof(float)); } godray->EndPass(); godray->End(); // second blur godray->SetTechnique("blur"); godray->SetVector("texelSize", &texelsize); godray->SetVector("lightPos", (D3DXVECTOR4*)&lightss); device->SetRenderTarget(0, occludersurf); godray->Begin(0, 0); godray->BeginPass(0); { device->SetTexture(0, blurtex); device->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 2, quadvertices, 6 * sizeof(float)); } godray->EndPass(); godray->End(); device->SetRenderState(D3DRS_ZENABLE, TRUE); }
void Render(float alpha, float elapsedtime) { static float time = 0; LPDIRECT3DSURFACE9 backbuffer = 0; D3DXMATRIX view, proj, viewproj; D3DXMATRIX world, inv; D3DXVECTOR4 texelsize; D3DXVECTOR4 lightpos(-600, 350, 1000, 1); D3DXVECTOR4 refllight; D3DXVECTOR3 eye(0, 0, -5.0f); D3DXVECTOR3 look(0, 1.2f, 0); D3DXVECTOR3 refleye, refllook; D3DXVECTOR3 up(0, 1, 0); D3DXVECTOR2 orient = cameraangle.smooth(alpha); D3DXMatrixRotationYawPitchRoll(&view, orient.x, orient.y, 0); D3DXVec3TransformCoord(&eye, &eye, &view); eye.y += 1.2f; D3DXMatrixPerspectiveFovLH(&proj, D3DX_PI / 2, (float)screenwidth / (float)screenheight, 0.1f, 30); time += elapsedtime; if( SUCCEEDED(device->BeginScene()) ) { device->GetRenderTarget(0, &backbuffer); // STEP 1: render reflection texture device->SetRenderTarget(0, reflectsurf); device->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, 0xff6694ed, 1.0f, 0); D3DXPLANE plane(0, 1, 0, 1); refleye = eye - 2 * D3DXPlaneDotCoord(&plane, &eye) * (D3DXVECTOR3&)plane; refllook = look - 2 * D3DXPlaneDotCoord(&plane, &look) * (D3DXVECTOR3&)plane; refllight = lightpos - 2 * D3DXPlaneDot(&plane, &lightpos) * (D3DXVECTOR4&)plane; refllight.w = 1; D3DXMatrixLookAtLH(&view, &refleye, &refllook, &up); D3DXMatrixMultiply(&viewproj, &view, &proj); D3DXMatrixInverse(&inv, 0, &viewproj); D3DXMatrixTranspose(&inv, &inv); D3DXPlaneTransform(&plane, &plane, &inv); device->SetClipPlane(0, &plane.a); RenderScene(viewproj, refleye, refllight, true); // STEP 2: render scene (later used for refraction) D3DXMatrixLookAtLH(&view, &eye, &look, &up); D3DXMatrixMultiply(&viewproj, &view, &proj); device->SetRenderTarget(0, refractsurf); device->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, 0xff6694ed, 1.0f, 0); RenderScene(viewproj, eye, lightpos, false); // render water surface into alpha channel for masking device->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_ALPHA); D3DXMatrixTranslation(&world, 0, -1, 0); device->SetTransform(D3DTS_WORLD, &world); device->SetTransform(D3DTS_VIEW, &view); device->SetTransform(D3DTS_PROJECTION, &proj); waterplane->DrawSubset(0, DXObject::Opaque); device->SetRenderState(D3DRS_COLORWRITEENABLE, 0x0f); // STEP 3: light shafts quadvertices[6] = quadvertices[24] = quadvertices[30] = (float)screenwidth - 0.5f; quadvertices[13] = quadvertices[19] = quadvertices[31] = (float)screenheight - 0.5f; RenderLightShafts(view, proj, eye, lightpos); // STEP 4: gamma correct device->SetRenderTarget(0, sceneldrsurf); device->SetRenderState(D3DRS_ZENABLE, FALSE); device->SetVertexDeclaration(quaddecl); bloom->SetTechnique("gammacorrect"); bloom->Begin(0, 0); bloom->BeginPass(0); { device->SetTexture(0, refraction); device->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 2, quadvertices, 6 * sizeof(float)); } bloom->EndPass(); bloom->End(); device->SetRenderState(D3DRS_ZENABLE, TRUE); // STEP 5: water surface device->SetRenderState(D3DRS_SRGBWRITEENABLE, TRUE); D3DXMatrixTranslation(&world, 0, -1, 0); D3DXMatrixIdentity(&inv); water->SetMatrix("matViewProj", &viewproj); water->SetMatrix("matWorld", &world); water->SetMatrix("matWorldInv", &inv); water->SetVector("eyePos", (D3DXVECTOR4*)&eye); water->SetVector("lightPos", &lightpos); water->SetVector("lightColor", &lightcolor); water->SetFloat("time", time); water->Begin(0, 0); water->BeginPass(0); { device->SetTexture(0, refraction); device->SetTexture(1, reflection); device->SetTexture(2, waves); waterplane->DrawSubset(0, DXObject::Opaque); } water->EndPass(); water->End(); device->SetRenderState(D3DRS_SRGBWRITEENABLE, FALSE); // STEP 6: downsample & blur quadvertices[6] = quadvertices[24] = quadvertices[30] = (float)screenwidth * 0.5f - 0.5f; quadvertices[13] = quadvertices[19] = quadvertices[31] = (float)screenheight * 0.5f - 0.5f; device->SetRenderTarget(0, bloomsurf1); device->SetRenderState(D3DRS_ZENABLE, FALSE); device->SetVertexDeclaration(quaddecl); texelsize.x = 1.0f / screenwidth; texelsize.y = 1.0f / screenheight; bloom->SetTechnique("downsample"); bloom->SetVector("texelSize", &texelsize); bloom->Begin(0, 0); bloom->BeginPass(0); { device->SetTexture(0, sceneldr); device->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 2, quadvertices, 6 * sizeof(float)); } bloom->EndPass(); bloom->End(); device->SetRenderTarget(0, bloomsurf2); texelsize.x = 2.0f / screenwidth; texelsize.y = 2.0f / screenheight; bloom->SetTechnique("blur"); bloom->SetVector("texelSize", &texelsize); bloom->Begin(0, 0); bloom->BeginPass(0); { device->SetTexture(0, bloomtex1); device->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 2, quadvertices, 6 * sizeof(float)); } bloom->EndPass(); bloom->End(); // STEP 7: add light shafts quadvertices[6] = quadvertices[24] = quadvertices[30] = (float)screenwidth - 0.5f; quadvertices[13] = quadvertices[19] = quadvertices[31] = (float)screenheight - 0.5f; device->SetRenderTarget(0, backbuffer); godray->SetTechnique("final"); godray->Begin(0, 0); godray->BeginPass(0); { device->SetTexture(0, sceneldr); device->SetTexture(1, occluders); device->SetTexture(2, bloomtex2); device->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 2, quadvertices, 6 * sizeof(float)); } godray->EndPass(); godray->End(); backbuffer->Release(); device->SetRenderState(D3DRS_ZENABLE, TRUE); device->EndScene(); } device->Present(NULL, NULL, NULL, NULL); }
static void ParticleSimulation(void) { LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9(); device->SetRenderTarget(0, g_pSurfaces[TEX_POSITION1]); device->SetRenderTarget(1, g_pSurfaces[TEX_VELOCITY1]); device->SetDepthStencilSurface(NULL); RECT rect; rect.left = 0; rect.right = g_texture_width; rect.top = 0; rect.bottom = g_num_particles / g_texture_width; if ( rect.bottom==0 ) return; device->SetScissorRect(&rect); device->SetRenderState(D3DRS_SCISSORTESTENABLE, TRUE); D3DXHANDLE shader = g_pParticleFX->GetTechniqueByName("Simulate"); D3DXHANDLE positiontex_var = g_pParticleFX->GetParameterByName(NULL, "PositionTex"); D3DXHANDLE velocitytex_var = g_pParticleFX->GetParameterByName(NULL, "VelocityTex"); D3DXHANDLE noisetex_var = g_pParticleFX->GetParameterByName(NULL, "NoiseTex"); D3DXHANDLE force_var = g_pParticleFX->GetParameterByName(NULL, "Force"); D3DXHANDLE time_var = g_pParticleFX->GetParameterByName(NULL, "fTimeAdvance"); D3DXHANDLE rand_var = g_pParticleFX->GetParameterByName(NULL, "Rand"); D3DXHANDLE tan_var = g_pParticleFX->GetParameterByName(NULL, "fTan"); D3DXHANDLE liferange_var = g_pParticleFX->GetParameterByName(NULL, "LifeRange"); D3DXHANDLE speedrange_var = g_pParticleFX->GetParameterByName(NULL, "SpeedRange"); D3DXHANDLE sizerange_var = g_pParticleFX->GetParameterByName(NULL, "SizeRange"); Vector4 vForce = g_vForce * g_fTimeAdvance; Vector4 vRand[3]; Vector4 vLifeRange(1.0f, 2.0f, 0.0f, 0.0f); Vector4 vSpeedRange(1.0f, 2.0f, 0.0f, 0.0f); Vector4 vSizeRange(0.01f, 0.02f, 0.0f, 0.0f); for ( int i=0; i<3; i++ ) { vRand[i][0] = float(rand()%1024)/1024.0f; vRand[i][1] = float(rand()%1024)/1024.0f; vRand[i][2] = float(rand()%1024)/1024.0f; vRand[i][3] = float(rand()%1024)/1024.0f; } g_pParticleFX->SetTechnique(shader); g_pParticleFX->SetTexture(positiontex_var, g_pTextures[TEX_POSITION0]); g_pParticleFX->SetTexture(velocitytex_var, g_pTextures[TEX_VELOCITY0]); g_pParticleFX->SetTexture(noisetex_var, g_pNoiseTexture); g_pParticleFX->SetVector(force_var, (D3DXVECTOR4*)&vForce); g_pParticleFX->SetVectorArray(rand_var, (D3DXVECTOR4*)&vRand, 3); g_pParticleFX->SetVector(liferange_var, (D3DXVECTOR4*)&vLifeRange); g_pParticleFX->SetVector(speedrange_var, (D3DXVECTOR4*)&vSpeedRange); g_pParticleFX->SetVector(sizerange_var, (D3DXVECTOR4*)&vSizeRange); g_pParticleFX->SetFloat(time_var, g_fTimeAdvance); g_pParticleFX->SetFloat(tan_var, FastMath::Tan(FastMath::DegToRad(g_fEmitTheta))); g_pParticleFX->Begin(NULL,0); g_pParticleFX->BeginPass(0); GutDrawFullScreenQuad_DX9(&g_ImageInfo); g_pParticleFX->EndPass(); g_pParticleFX->End(); device->SetRenderTarget(1, NULL); device->SetRenderState(D3DRS_SCISSORTESTENABLE, FALSE); }