*
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
#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__
|
||||
Reference in New Issue
Block a user