Files
2025-05-13 02:46:21 +03:00

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__