示例#1
0
void RenderFrameDX9(void)
{
	LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9();
	
	device->BeginScene(); 

	AddImpulse();
	WaterSimulation();
	HeightmapToNormal();

	device->SetRenderTarget(0, g_pMainFramebuffer);
	device->SetDepthStencilSurface(g_pMainDepthbuffer);
	device->Clear(0, NULL, D3DCLEAR_ZBUFFER, 0x0, 1.0f, 0);

	RenderWater();
	DrawObject();

	SwapHeightmaps();

	float x = -1.0f;
	float y = -1.0f;
	float w = 0.4f;
	float h = 0.4f;

	if ( g_iMode & 0x01 )
	{
		DrawImage(g_pTextures[TEX_HEIGHT2], x, y, w, h, &g_ImageInfo);
		x+=w;
	}

	if ( g_iMode & 0x02 )
	{
		D3DXHANDLE shader = g_pWaterEffect->GetTechniqueByName("Heightmap");
		D3DXHANDLE heightmap_var = g_pWaterEffect->GetTechniqueByName("heightmap_current");

		g_pWaterEffect->SetTechnique(shader);
		g_pWaterEffect->SetTexture(heightmap_var, g_pTextures[TEX_HEIGHT2]);

		g_pWaterEffect->Begin(NULL, 0);
		g_pWaterEffect->BeginPass(0);
			GutDrawScreenQuad_DX9(x, y, w, h, &g_ImageInfo);
		g_pWaterEffect->EndPass();
		g_pWaterEffect->End();

		x+=w;
	}

	if ( g_iMode & 0x04 )
	{
		DrawImage(g_pTextures[TEX_NORMAL], x, y, w, h, &g_ImageInfo);
		x+=w;
	}

	device->EndScene(); 
    device->Present( NULL, NULL, NULL, NULL );
}
示例#2
0
FXShader::FXShader(LPD3DXEFFECT FX,const char* name) : FXHandle(FX,name) {
    handle = FX->GetTechniqueByName(name);
    if(!handle) {
        Globals::console->Write("ERROR: cannot create D3DXHANDLE to shader '%s'\r\n",name);
    }
    Reset();
}
示例#3
0
void AutoExposure(void)
{
	LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9();

	D3DXHANDLE shader = g_pExposureEffect->GetTechniqueByName("AutoExposure");
	g_pExposureEffect->SetTechnique(shader);

	Vector4 vMiddleGray(0.5f);
	Vector4 vMultiplierClamp(0.2f, 3.0f, 0.0f, 0.0f);

	D3DXHANDLE middlegray_var = g_pExposureEffect->GetParameterByName(NULL, "vMiddleGray");
	D3DXHANDLE clamp_var = g_pExposureEffect->GetParameterByName(NULL, "vMultiplierClamp");
	D3DXHANDLE image0_var = g_pExposureEffect->GetParameterByName(NULL, "Image");
	D3DXHANDLE image1_var = g_pExposureEffect->GetParameterByName(NULL, "Image2");

	g_pExposureEffect->SetVector(middlegray_var, (D3DXVECTOR4*)&vMiddleGray);
	g_pExposureEffect->SetVector(clamp_var, (D3DXVECTOR4*)&vMultiplierClamp);

	g_pExposureEffect->SetTexture(image0_var, g_pFrameBuffer[FULLSIZE]);
	g_pExposureEffect->SetTexture(image1_var, g_pFrameBuffer[LUMINANCE_TEMP]);

	g_pExposureEffect->Begin(NULL, 0);
	g_pExposureEffect->BeginPass(0);

	DrawFullScreenQuad(&g_ImageInfo);

	g_pExposureEffect->EndPass();
	g_pExposureEffect->End();
}
示例#4
0
void ConverToLogLuminance(LPDIRECT3DTEXTURE9 pSource, sImageInfo *pInfo)
{
	LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9();

	device->SetRenderTarget(0, g_pFrameSurface[DOWNSAMPLED_256x256]);
	device->SetDepthStencilSurface(NULL);

	D3DXHANDLE shader = g_pExposureEffect->GetTechniqueByName("LogLuminance");
	g_pExposureEffect->SetTechnique(shader);

	D3DXHANDLE tablevar = g_pExposureEffect->GetParameterByName(NULL, "vLuminanceTable");
	D3DXHANDLE imagevar = g_pExposureEffect->GetParameterByName(NULL, "Image");

	Vector4 vTable(0.21f, 0.71f, 0.072f);
	g_pExposureEffect->SetVector(tablevar, (D3DXVECTOR4*)&vTable);
	g_pExposureEffect->SetTexture(imagevar, pSource);

	g_pExposureEffect->Begin(NULL, 0);
	g_pExposureEffect->BeginPass(0);

	DrawFullScreenQuad(pInfo);

	g_pExposureEffect->EndPass();
	g_pExposureEffect->End();
}
示例#5
0
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();
}
示例#6
0
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;
}
示例#7
0
bool InitResourceDX9(void)
{
	LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9();

	for ( int i=0; i<NUM_FRAMEBUFFERS; i++ )
	{
		g_pFrameBuffer[i] = NULL;
		g_pFrameSurface[i] = NULL;
	}

	CGutModel::SetTexturePath("../../textures/");

	if ( !g_Model_DX9.ConvertToDX9Model(&g_Model) )
		return false;

	g_pEffect = GutLoadFXShaderDX9("../../shaders/Posteffect.fx");
	if ( NULL==g_pEffect )
		return false;

	g_pAddImageShader = g_pEffect->GetTechniqueByName("DrawImage");
	g_pBlurShader = g_pEffect->GetTechniqueByName("BlurImage");
	g_pBrightnessShader = g_pEffect->GetTechniqueByName("Brightness");

	if ( NULL==g_pAddImageShader || NULL==g_pBlurShader || 
		 NULL==g_pBrightnessShader )
		return false;

	g_pExposureEffect = GutLoadFXShaderDX9("../../shaders/Exposure.fx");
	if ( NULL==g_pExposureEffect )
		return false;

	if ( !ReInitResourceDX9() )
		return false;

	return true;
}
示例#8
0
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();
	}
}
示例#9
0
void ExpLuminance(LPDIRECT3DSURFACE9 pSurace, LPDIRECT3DTEXTURE9 pTexture, sImageInfo *pInfo)
{
	LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9();

	device->SetRenderTarget(0, pSurace);

	D3DXHANDLE shader = g_pExposureEffect->GetTechniqueByName("ExpLuminance");
	D3DXHANDLE image_var = g_pExposureEffect->GetParameterByName(NULL, "Image");

	g_pExposureEffect->SetTechnique(shader);
	g_pExposureEffect->SetTexture(image_var, pTexture);

	g_pExposureEffect->Begin(NULL, 0);
	g_pExposureEffect->BeginPass(0);

	DrawFullScreenQuad(pInfo);

	g_pExposureEffect->EndPass();
	g_pExposureEffect->End();
}
示例#10
0
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();
}
示例#11
0
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();
}
示例#12
0
void DrawImage(LPDIRECT3DTEXTURE9 pSource, float x0, float y0, float w, float h, sImageInfo *pInfo, bool bRedOnly = false)
{
	LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9();

	D3DXHANDLE shader = g_pPostEffect->GetTechniqueByName(bRedOnly ? "DrawImageRedChannel" : "DrawImage");
	D3DXHANDLE pTextureVar = g_pPostEffect->GetParameterByName(NULL, "Image");

	g_pPostEffect->SetTechnique(shader);
	g_pPostEffect->SetTexture(pTextureVar, pSource);

	// 設定頂點資料格式	
	device->SetFVF(D3DFVF_XYZ|D3DFVF_TEX1);

	g_pPostEffect->Begin(NULL, 0);
	g_pPostEffect->BeginPass(0);

	GutDrawScreenQuad_DX9(x0, y0, w, h, pInfo);

	g_pPostEffect->EndPass();
	g_pPostEffect->End();
}
示例#13
0
void ExpLuminance(void)
{
	LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9();

	device->SetRenderTarget(0, g_pFrameSurface[LUMINANCE_TEMP]);

	D3DXHANDLE shader = g_pExposureEffect->GetTechniqueByName("ExpLuminance");
	D3DXHANDLE image_var = g_pExposureEffect->GetParameterByName(NULL, "Image");
	
	g_pExposureEffect->SetTechnique(shader);
	g_pExposureEffect->SetTexture(image_var, g_pFrameBuffer[LUMINANCE_CURRENT]);

	g_pExposureEffect->Begin(NULL, 0);
	g_pExposureEffect->BeginPass(0);

	DrawFullScreenQuad(&g_Image1x1);

	g_pExposureEffect->EndPass();
	g_pExposureEffect->End();

	SwapRenderTarget(LUMINANCE_TEMP, LUMINANCE_CURRENT);
}
示例#14
0
void AdaptiveLuminance(void)
{
	static int count = 0;
	LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9();

	if ( count )
	{
		device->SetRenderTarget(0, g_pFrameSurface[LUMINANCE_TEMP]);

		D3DXHANDLE shader = g_pExposureEffect->GetTechniqueByName("AdaptiveLuminance");
		g_pExposureEffect->SetTechnique(shader);

		Vector4 vSpeed(0.03f);

		D3DXHANDLE speed_var = g_pExposureEffect->GetParameterByName(NULL, "vAdaptiveSpeed");
		D3DXHANDLE image0_var = g_pExposureEffect->GetParameterByName(NULL, "Image");
		D3DXHANDLE image1_var = g_pExposureEffect->GetParameterByName(NULL, "Image2");

		g_pExposureEffect->SetVector(speed_var, (D3DXVECTOR4*)&vSpeed);
		g_pExposureEffect->SetTexture(image0_var, g_pFrameBuffer[LUMINANCE_PREVIOUS]);
		g_pExposureEffect->SetTexture(image1_var, g_pFrameBuffer[LUMINANCE_CURRENT]);

		g_pExposureEffect->Begin(NULL, 0);
		g_pExposureEffect->BeginPass(0);

		DrawFullScreenQuad(&g_Image1x1);

		g_pExposureEffect->EndPass();
		g_pExposureEffect->End();
	}
	else
	{
		device->StretchRect(g_pFrameSurface[LUMINANCE_CURRENT], NULL, g_pFrameSurface[LUMINANCE_TEMP], NULL, D3DTEXF_POINT);
	}
	// copy
	//device->StretchRect(g_pFrameSurface[LUMINANCE_TEMP], NULL, g_pFrameSurface[LUMINANCE_PREVIOUS], NULL, D3DTEXF_POINT);
	SwapRenderTarget(LUMINANCE_TEMP, LUMINANCE_PREVIOUS);
	count++;
}
示例#15
0
void DrawImage(LPDIRECT3DTEXTURE9 pSource, sImageInfo *pInfo)
{
	LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9();

	// 計算貼圖像素的貼圖座標間距
	int w = pInfo->m_iWidth;
	int h = pInfo->m_iHeight;

	float fTexelW = 1.0f/(float)w;
	float fTexelH = 1.0f/(float)h;

	// Direct3D9會偏移半個像素, 從貼圖座標來把它修正回來
	Vector4 vTexoffset(fTexelW*0.5f, fTexelH*0.5f, 0.0f, 1.0f);

	Vertex_VT quad[4];
	memcpy(quad, g_FullScreenQuad, sizeof(quad));
	for ( int i=0; i<4; i++ )
	{
		quad[i].m_Texcoord[0] += vTexoffset[0];
		quad[i].m_Texcoord[1] += vTexoffset[1];
	}

	D3DXHANDLE shader = g_pEffect->GetTechniqueByName("DrawImage");
	D3DXHANDLE pTextureVar = g_pEffect->GetParameterByName(NULL, "Image");

	g_pEffect->SetTechnique(shader);
	g_pEffect->SetTexture(pTextureVar, pSource);

	// 設定頂點資料格式	
	device->SetFVF(D3DFVF_XYZ|D3DFVF_TEX1);

	g_pEffect->Begin(NULL, 0);
	g_pEffect->BeginPass(0);
	
	device->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, quad, sizeof(Vertex_VT));
	
	g_pEffect->EndPass();
	g_pEffect->End();
}
示例#16
0
void RenderFrameDX9(void)
{
	LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9();
	device->BeginScene(); 
	device->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER|D3DCLEAR_STENCIL, 0x0, 1.0f, 0);

	Matrix4x4 view_matrix = g_Control.GetViewMatrix();
	Matrix4x4 world_matrix = g_Control.GetObjectMatrix();
	Matrix4x4 wv_matrix = world_matrix * view_matrix;
	Matrix4x4 wvp_matrix = wv_matrix * g_proj_matrix;

	DrawImage(g_pTexture, &g_ImageInfo);

	D3DXHANDLE shader = g_pRefractionFX->GetTechniqueByName("Refraction");
	D3DXHANDLE texture = g_pRefractionFX->GetParameterByName(NULL, "BackgroundImage");
	D3DXHANDLE wv_matrix_h = g_pRefractionFX->GetParameterByName(NULL, "wv_matrix");
	D3DXHANDLE wvp_matrix_h = g_pRefractionFX->GetParameterByName(NULL, "wvp_matrix");
	D3DXHANDLE objectcolor_h = g_pRefractionFX->GetParameterByName(NULL, "object_color");

	g_pRefractionFX->SetTechnique(shader);
	g_pRefractionFX->SetTexture(texture, g_pTexture);
	g_pRefractionFX->SetMatrix(wv_matrix_h, (D3DXMATRIX *)&wv_matrix);
	g_pRefractionFX->SetMatrix(wvp_matrix_h, (D3DXMATRIX *)&wvp_matrix);
	g_pRefractionFX->SetVector(objectcolor_h, (D3DXVECTOR4 *)&g_vObjectColor);

	g_pRefractionFX->Begin(NULL, 0);
	g_pRefractionFX->BeginPass(0);

	g_Model_DX9.Render(0);

	g_pRefractionFX->EndPass();
	g_pRefractionFX->End();

	device->EndScene();
	device->Present( NULL, NULL, NULL, NULL );
}
示例#17
0
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);
}
示例#18
0
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();
	}
}