void AverageLuminance(LPDIRECT3DTEXTURE9 pSource) { LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9(); D3DXHANDLE shader = g_pExposureEffect->GetTechniqueByName("Average16Samples"); g_pExposureEffect->SetTechnique(shader); D3DXHANDLE texoffset_var = g_pExposureEffect->GetParameterByName(NULL, "vTexOffset"); D3DXHANDLE image_var = g_pExposureEffect->GetParameterByName(NULL, "Image"); float fTexX, fTexY; Vector4 vTexOffset_256x256[16]; Vector4 vTexOffset_64x64[16]; Vector4 vTexOffset_16x16[16]; Vector4 vTexOffset_4x4[16]; int index = 0; index=0; fTexX = 1.0f/256.0f; fTexY = 1.0f/256.0f; for ( int y=0; y<4; y++ ) { for ( int x=0; x<4; x++ ) { vTexOffset_256x256[index].Set(x*fTexX, y*fTexY, 0.0f, 0.0f); index++; } } index=0; fTexX = 1.0f/64.0f; fTexY = 1.0f/64.0f; for ( int y=0; y<4; y++ ) { for ( int x=0; x<4; x++ ) { vTexOffset_64x64[index].Set(x*fTexX, y*fTexY, 0.0f, 0.0f); index++; } } index=0; fTexX = 1.0f/16.0f; fTexY = 1.0f/16.0f; for ( int y=0; y<4; y++ ) { for ( int x=0; x<4; x++ ) { vTexOffset_16x16[index].Set(x*fTexX, y*fTexY, 0.0f, 0.0f); index++; } } index=0; fTexX = 1.0f/4.0f; fTexY = 1.0f/4.0f; for ( int y=0; y<4; y++ ) { for ( int x=0; x<4; x++ ) { vTexOffset_4x4[index].Set(x*fTexX, y*fTexY, 0.0f, 0.0f); index++; } } // 256x256 -> 64x164 { device->SetRenderTarget(0, g_pFrameSurface[DOWNSAMPLED_64x64]); device->SetDepthStencilSurface(NULL); g_pExposureEffect->SetVectorArray(texoffset_var, (D3DXVECTOR4*)vTexOffset_256x256, 16); g_pExposureEffect->SetTexture(image_var, pSource); g_pExposureEffect->Begin(NULL, 0); g_pExposureEffect->BeginPass(0); DrawFullScreenQuad(&g_Image64x64); g_pExposureEffect->EndPass(); g_pExposureEffect->End(); } // 64x64 -> 16x16 { device->SetRenderTarget(0, g_pFrameSurface[DOWNSAMPLED_16x16]); device->SetDepthStencilSurface(NULL); g_pExposureEffect->SetVectorArray(texoffset_var, (D3DXVECTOR4*)vTexOffset_64x64, 16); g_pExposureEffect->SetTexture(image_var, pSource); g_pExposureEffect->Begin(NULL, 0); g_pExposureEffect->BeginPass(0); DrawFullScreenQuad(&g_Image64x64); g_pExposureEffect->EndPass(); g_pExposureEffect->End(); } // 16x16 -> 4x4 { device->SetRenderTarget(0, g_pFrameSurface[DOWNSAMPLED_4x4]); g_pExposureEffect->SetVectorArray(texoffset_var, (D3DXVECTOR4*)vTexOffset_16x16, 16); g_pExposureEffect->SetTexture(image_var, g_pFrameBuffer[DOWNSAMPLED_16x16]); g_pExposureEffect->Begin(NULL, 0); g_pExposureEffect->BeginPass(0); DrawFullScreenQuad(&g_Image16x16); g_pExposureEffect->EndPass(); g_pExposureEffect->End(); } // 4x4 -> 1x1 { device->SetRenderTarget(0, g_pFrameSurface[LUMINANCE_CURRENT]); g_pExposureEffect->SetVectorArray(texoffset_var, (D3DXVECTOR4*)vTexOffset_4x4, 16); g_pExposureEffect->SetTexture(image_var, g_pFrameBuffer[DOWNSAMPLED_4x4]); g_pExposureEffect->Begin(NULL, 0); g_pExposureEffect->BeginPass(0); DrawFullScreenQuad(&g_Image4x4); g_pExposureEffect->EndPass(); g_pExposureEffect->End(); } }
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); }