#include "EffectManager.h"
CEffectManager::CEffectManager(LPDIRECT3DDEVICE9 device):m_pShadowZBuffer(NULL),m_pD3DMesh(NULL),m_pShadowSurface(NULL),m_pD3DShadowZBufferEffect(NULL), m_pD3DShadowEffect(NULL),m_pShadowDBuffer(NULL), m_pShadowTexture(NULL),m_pD3DRefractionEffect(NULL),m_pD3DDevice(device),m_pD3DBlurEffect(NULL),m_pD3DDepthOfFieldEffect(NULL), m_pCFxShader(NULL),m_pBrightTexture(NULL),m_pBrightSurface(NULL),m_pMainDBuffer(NULL),m_pMainZBuffer(NULL),m_pDoFSurface(NULL),m_pDoFTexture(NULL),m_pZBufferTexture(NULL),m_pZBufferSurface(NULL)
{
m_pBlurTexture[0] = NULL;
m_pBlurTexture[1] = NULL;
m_pBlurSurface[0] = NULL;
m_pBlurSurface[1] = NULL;
}
CEffectManager::~CEffectManager(void)
{
Release(m_pD3DDevice);
Release(m_pD3DLinearZEffect);
Release(m_pD3DMesh);
Release(m_pD3DShadowZBufferEffect);
Delete(m_pCFxShader);
}
void CEffectManager::Init(){
//load fx files
m_pCFxShader = new CFxShader(m_pD3DDevice);
m_pD3DBlurEffect = m_pCFxShader->LoadFxEffect("Posteffect.fx");
m_pD3DLinearZEffect = m_pCFxShader->LoadFxEffect("LinearZ.fx");
m_pD3DRefractionEffect = m_pCFxShader->LoadFxEffect("refraction.fx");
m_pD3DShadowEffect = m_pCFxShader->LoadFxEffect("Shadowmap.fx");
m_pD3DShadowZBufferEffect = m_pCFxShader->LoadFxEffect("ZPass.fx");
//init test mesh
D3DXCreateTeapot(m_pD3DDevice, &m_pD3DMesh, 0);
}
LPDIRECT3DTEXTURE9 CEffectManager::Blur(LPDIRECT3DTEXTURE9 pSourceTexture,UINT w,UINT h){
m_pD3DDevice->GetDepthStencilSurface(&m_pMainDBuffer);
m_pD3DDevice->GetRenderTarget(0, &m_pMainZBuffer);
m_pMainZBuffer->Release();
m_pMainDBuffer->Release();
m_pD3DDevice->SetRenderState(D3DRS_ZENABLE, false);
m_pD3DDevice->SetRenderState(D3DRS_ZWRITEENABLE, false);
Vertex_VT m_FullScreenQuad[4] =
{
{{-1.0f, -1.0f, 0.0f},{0.0f, 1.0f}},
{{ 1.0f, -1.0f, 0.0f},{1.0f, 1.0f}},
{{-1.0f, 1.0f, 0.0f},{0.0f, 0.0f}},
{{ 1.0f, 1.0f, 0.0f},{1.0f, 0.0f}}
};
//init texture
if(m_pBlurTexture[0] == NULL){
m_pD3DDevice->CreateTexture(w, h, 1,
D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8,
D3DPOOL_DEFAULT, &m_pBlurTexture[0], NULL);
m_pBlurTexture[0]->GetSurfaceLevel(0, &m_pBlurSurface[0]);
m_pD3DDevice->CreateTexture(w, h, 1,
D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8,
D3DPOOL_DEFAULT, &m_pBlurTexture[1], NULL);
m_pBlurTexture[1]->GetSurfaceLevel(0, &m_pBlurSurface[1]);
}
//init parameter
Vertex_VT quad[4];
D3DXVECTOR4 vTexoffset(1.0f/w*0.5f, 1.0f/h*0.5f, 0.0f, 1.0f);
memcpy(quad, m_FullScreenQuad, sizeof(quad));
for ( int i=0; i<4; i++ )
{
quad[i].m_Texcoord[0] += vTexoffset[0];
quad[i].m_Texcoord[1] += vTexoffset[1];
}
D3DXVECTOR4 vTexOffsetX[9];
D3DXVECTOR4 vTexOffsetY[9];
float weight_table[9] = {1.0f, 1.5f, 3.0f, 4.0f, 5.0f, 4.0f, 3.0f, 1.5f, 1.0f};
float sum = 0.0f;
for (int i=0; i<9; i++ )
{
sum += weight_table[i];
}
for (int i=0; i<9; i++ )
{
weight_table[i] /= sum;
}
float uv_offset_table[9] = {-7.5f, -5.5f, -3.5f, -1.5f, 0.0f, 1.5f, 3.5f, 5.5f, 7.5f};
for ( int i=0; i<9; i++ )
{
vTexOffsetX[i] = D3DXVECTOR4(uv_offset_table[i] * 1.0f / w , 0.0f, 0.0f, weight_table[i]);
vTexOffsetY[i] = D3DXVECTOR4(0.0f, uv_offset_table[i] *1.0f / h, 0.0f, weight_table[i]);
}
//set parameter
D3DXHANDLE pBlurShader = m_pD3DBlurEffect->GetTechniqueByName("BlurImage");
m_pD3DBlurEffect->SetTechnique(pBlurShader);
D3DXHANDLE pTexOffsetVar = m_pD3DBlurEffect->GetParameterByName(NULL, "vTexOffset");
D3DXHANDLE pTextureVar = m_pD3DBlurEffect->GetParameterByName(NULL, "Image");
//x axis blur
m_pD3DBlurEffect->SetVectorArray(pTexOffsetVar, (D3DXVECTOR4*)vTexOffsetX, 9);
m_pD3DBlurEffect->SetTexture(pTextureVar, pSourceTexture);
m_pD3DBlurEffect->Begin(NULL, 0);
m_pD3DBlurEffect->BeginPass(0);
m_pD3DDevice->SetRenderTarget(0,m_pBlurSurface[0]);
m_pD3DDevice->SetDepthStencilSurface(NULL);
m_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, quad, sizeof(Vertex_VT));
m_pD3DBlurEffect->EndPass();
m_pD3DBlurEffect->End();
//y axis blur
m_pD3DBlurEffect->SetVectorArray(pTexOffsetVar, (D3DXVECTOR4*)vTexOffsetY, 9);
m_pD3DBlurEffect->SetTexture(pTextureVar, m_pBlurTexture[0]);
m_pD3DBlurEffect->Begin(NULL, 0);
m_pD3DBlurEffect->BeginPass(0);
m_pD3DDevice->SetRenderTarget(0, m_pBlurSurface[1]);
m_pD3DDevice->SetDepthStencilSurface(NULL);
m_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, quad, sizeof(Vertex_VT));
m_pD3DBlurEffect->EndPass();
m_pD3DBlurEffect->End();
m_pD3DDevice->SetRenderTarget(0, m_pMainZBuffer);
m_pD3DDevice->SetDepthStencilSurface(m_pMainDBuffer);
m_pD3DDevice->SetRenderState(D3DRS_ZENABLE,true);
m_pD3DDevice->SetRenderState(D3DRS_ZWRITEENABLE, true);
return m_pBlurTexture[1];
}
void CEffectManager::DrawImage(LPDIRECT3DTEXTURE9 pSource, UINT w,UINT h){
Vertex_VT m_FullScreenQuad[4] =
{
{{-1.0f, -1.0f, 0.0f},{0.0f, 1.0f}},
{{ 1.0f, -1.0f, 0.0f},{1.0f, 1.0f}},
{{-1.0f, 1.0f, 0.0f},{0.0f, 0.0f}},
{{ 1.0f, 1.0f, 0.0f},{1.0f, 0.0f}}
};
Vertex_VT quad[4];
D3DXVECTOR4 vTexoffset(1.0f/w*0.5f, 1.0f/h*0.5f, 0.0f, 1.0f);
memcpy(quad, m_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 pAddShader = m_pD3DBlurEffect->GetTechniqueByName("AddImage");
m_pD3DBlurEffect->SetTechnique(pAddShader);
D3DXHANDLE pTextureVar = m_pD3DBlurEffect->GetParameterByName(NULL, "Image");
m_pD3DBlurEffect->SetTexture(pTextureVar, pSource);
m_pD3DDevice->SetFVF(D3DFVF_XYZ|D3DFVF_TEX1);
m_pD3DBlurEffect->Begin(NULL, 0);
m_pD3DBlurEffect->BeginPass(0);
m_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, quad, sizeof(Vertex_VT));
m_pD3DBlurEffect->EndPass();
m_pD3DBlurEffect->End();
}
LPDIRECT3DTEXTURE9 CEffectManager::Brighting(LPDIRECT3DTEXTURE9 pSource, UINT w,UINT h){
m_pD3DDevice->GetDepthStencilSurface(&m_pMainDBuffer);
m_pD3DDevice->GetRenderTarget(0, &m_pMainZBuffer);
m_pMainZBuffer->Release();
m_pMainDBuffer->Release();
if(m_pBrightTexture == NULL){
m_pD3DDevice->CreateTexture(w, h, 1,
D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8,
D3DPOOL_DEFAULT, &m_pBrightTexture, NULL);
m_pBrightTexture->GetSurfaceLevel(0, &m_pBrightSurface);
}
Vertex_VT g_FullScreenQuad[4] =
{
{{-1.0f, -1.0f, 0.0f},{0.0f, 1.0f}},
{{ 1.0f, -1.0f, 0.0f},{1.0f, 1.0f}},
{{-1.0f, 1.0f, 0.0f},{0.0f, 0.0f}},
{{ 1.0f, 1.0f, 0.0f},{1.0f, 0.0f}}
};
D3DXVECTOR4 vTexoffset(1.0f / w * 0.5f, 1.0f /h *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];
}
m_pD3DDevice->SetRenderState(D3DRS_ZENABLE, false);
m_pD3DDevice->SetRenderState(D3DRS_ZWRITEENABLE, false);
D3DXHANDLE pShader = m_pD3DBlurEffect->GetTechniqueByName("Brightness");
m_pD3DBlurEffect->SetTechnique(pShader);
//set the parameters to fx
D3DXHANDLE pOffsetVar = m_pD3DBlurEffect->GetParameterByName(NULL, "IntensityOffset");
D3DXHANDLE pIntensityVar = m_pD3DBlurEffect->GetParameterByName(NULL, "IntensityScale");
D3DXHANDLE pTextureVar = m_pD3DBlurEffect->GetParameterByName(NULL, "Image");
D3DXVECTOR4 vBrightnessOffset(0.0f,0.0f,0.0f,0.0f);
D3DXVECTOR4 vBrightnessScale(10.0f, 10.0f, 10.0f, 10.0f);
m_pD3DBlurEffect->SetVector(pOffsetVar, (D3DXVECTOR4*)&vBrightnessOffset);
m_pD3DBlurEffect->SetVector(pIntensityVar, (D3DXVECTOR4*)&vBrightnessScale);
m_pD3DBlurEffect->SetTexture(pTextureVar, pSource);
//set FVF
m_pD3DDevice->SetFVF(D3DFVF_XYZ|D3DFVF_TEX1);
//render to m_pFrameBuffer[1]
m_pD3DDevice->SetRenderTarget(0, m_pBrightSurface);
m_pD3DDevice->SetDepthStencilSurface(NULL);
m_pD3DBlurEffect->Begin(NULL, 0);
m_pD3DBlurEffect->BeginPass(0);
m_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, quad, sizeof(Vertex