86 lines
2.9 KiB
C++
86 lines
2.9 KiB
C++
#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__
|