#ifndef PostDOF_h__ #define PostDOF_h__ #include "render/PostEffect.h" #include "Globals.h" #include "render/ITextureSampler.h" #include "math/LifeMath.h" #include "LifeDebug.h" namespace LifeGraphics { class PostDOF : public PostEffect { private: IRenderer* renderer; IShader* psDof; IBlendState* blendState; IBlendState* blendStateOpaque; IDepthStencilState* depthState; public: ITexture2D* dofBlur1; ITexture2D* dofBlur2; ITexture2D* dofBlur3; ITexture2D* dofBlur4; //ITexture2D* dofResult; PostDOF() { } ITexture2D* Execute(PostEffectParams& params) { renderer->SetBlendState(blendStateOpaque); renderer->SetDepthStencilState(depthState); renderer->UnbindResourcesPS(); renderer->UnbindRenderTargets(); LifeMath::float4 color(1.0f, 0.0f, 0.0f, 1.0f); renderer->ClearRenderTarget(dofBlur1, &color); renderer->DownSample2x2(params.renderTarget, dofBlur1, params.depthTarget); renderer->UnbindResourcesPS(); renderer->UnbindRenderTargets(); renderer->DownSample2x2(dofBlur1, dofBlur2, params.depthTarget); renderer->UnbindResourcesPS(); renderer->UnbindRenderTargets(); renderer->DownSample2x2(dofBlur2, dofBlur3, params.depthTarget); renderer->UnbindResourcesPS(); renderer->UnbindRenderTargets(); renderer->DownSample2x2(dofBlur3, dofBlur4, params.depthTarget); renderer->UnbindResourcesPS(); renderer->UnbindRenderTargets(); LifeMath::Rect2i vp = LifeMath::Rect2i(0,0,params.renderTarget->Width(), params.renderTarget->Height()); renderer->SetScissorRectangle(vp); renderer->SetViewport(vp); renderer->SetPixelShader(psDof); renderer->SetPSTexture(params.depthTex, 1); renderer->SetPSTexture(dofBlur4, 2); renderer->SetTargets(params.renderTarget, params.depthTarget); renderer->SetBlendState(blendState); renderer->SetDepthStencilState(depthState); renderer->RenderToTextureNoPs(); return dofBlur1; } void Init(SceneDescriptor& desc) { renderer = CG::me()->GetRenderer(); dofBlur1 = renderer->CreateRenderTarget(desc.width / 2, desc.height / 2, FORMAT_R16G16B16A16_FLOAT); dofBlur2 = renderer->CreateRenderTarget(desc.width / 4, desc.height / 4, FORMAT_R16G16B16A16_FLOAT); dofBlur3 = renderer->CreateRenderTarget(desc.width / 8, desc.height / 8, FORMAT_R16G16B16A16_FLOAT); dofBlur4 = renderer->CreateRenderTarget(desc.width / 16, desc.height / 16, FORMAT_R16G16B16A16_FLOAT); //dofResult = renderer->CreateRenderTarget(desc.width, desc.height); // psDof = ResourceManager::me()->CompileUserShaderPS(STR("PostDOF.psh")); blendState = renderer->CreateBlendState(true, false, BLEND_OP_ADD, BLEND_SRC_ALPHA, BLEND_INV_SRC_ALPHA, 1 | 2 | 4 | 8); blendStateOpaque = renderer->CreateBlendState(false, false, BLEND_OP_ADD, BLEND_SRC_ALPHA, BLEND_INV_SRC_ALPHA, 1 | 2 | 4 | 8); depthState = renderer->CreateDSState(false, false, COMPARISON_NEVER); } }; } #endif // PostDOF_h__