Files
LifeProject/LifeGraphics/render/PostSSAO.cpp
T
2025-05-13 02:46:21 +03:00

101 lines
2.8 KiB
C++

#include "render/PostSSAO.h"
#include "IScene.h"
#include "ResourceManager.h"
namespace LifeGraphics
{
struct QUAD_VERT
{
LifeMath::float4 position;
LifeMath::float2 texcoord;
};
PostSSAO::PostSSAO(IScene* scene, QUALITY effectQuality)
{
pScene = scene;
pRenderer = CG::me()->GetRenderer();
ssaoSize = pScene->getOutputSize();
int divider = 1;
//adjust ssao texture size by quality
switch(effectQuality)
{
case Q_MED:
divider = 2;
break;
case Q_LOW:
divider = 4;
break;
}
ssaoSize /= divider;
ssaoTex = pRenderer->CreateRenderTarget(ssaoSize.X, ssaoSize.Y, FORMAT_R8_UNORM);
ssaoBlur = pRenderer->CreateRenderTarget(ssaoSize.X, ssaoSize.Y, FORMAT_R8_UNORM);
psRender = ResourceManager::me()->CompileUserShaderPS(String(_text("SSAO.psh")));
vs = ResourceManager::me()->CompileUserShaderVS(String(_text("SSAO.vsh")));
psBlur = ResourceManager::me()->CompileUserShaderPS(String(_text("SSAO_BLUR.psh")));
ISamplerDescription pscDesc(Clamp, Clamp, Clamp, MinMagMipPoint);
ISamplerDescription lsDesc(Wrap, Wrap, Wrap, MinMagMipLinear);
linearSampler = CG::me()->GetRenderer()->CreateTextureSampler(&lsDesc);
pointSamplerClamp = CG::me()->GetRenderer()->CreateTextureSampler(&pscDesc);
depthState = pRenderer->CreateDSState(false, false, COMPARISON_NEVER);
ssaoRandom = ResourceManager::me()->GetTexture(String(_text("root/Data/Textures/ssao_random.bmp")));
}
void PostSSAO::process(IConstantBuffer* camera, ITexture2D* sceneGbuf, ITexture2D* sceneDepthTarget)
{
pRenderer->UnbindRenderTargets();
//pRenderer->SetPSConstantBuffer(cbGlobal, 0);
//pRenderer->SetVSConstantBuffer(cbGlobal, 0);
pRenderer->SetPSTextureSampler(pointSamplerClamp, 0);
pRenderer->SetPSTextureSampler(linearSampler, 1);
pRenderer->SetVSConstantBuffer(camera, 1);
pRenderer->SetPSConstantBuffer(camera, 1);
pRenderer->SetViewport(LifeMath::Rect2i(0, 0, ssaoSize.X, ssaoSize.Y));
pRenderer->SetDepthStencilState(depthState);
// renderer->SetBlendState(lppBlend);
pRenderer->SetVertexShader(vs);
pRenderer->SetPixelShader(psRender);
//pRenderer->ClearRenderTarget(ssaoTex, &color );
pRenderer->SetTargets(ssaoTex, sceneDepthTarget);
pRenderer->SetPSTexture(sceneGbuf, 0);
pRenderer->SetPSTexture(ssaoRandom.ptr(), 1);
pRenderer->RenderToTextureNoShader();
pRenderer->SetPSTextureSampler(linearSampler, 0);
pRenderer->SetPSTextureSampler(pointSamplerClamp, 1);
//blur ssao
pRenderer->UnbindRenderTargets();
pRenderer->SetTargets(ssaoBlur, sceneDepthTarget);
pRenderer->SetPSTexture(ssaoTex, 0);
pRenderer->SetPSTexture(sceneGbuf, 9);
pRenderer->SetPixelShader(psBlur);
pRenderer->RenderToTextureNoShader();
}
ITexture2D* PostSSAO::getTexture()
{
return ssaoBlur;
}
PostSSAO::~PostSSAO()
{
vs->Release();
psBlur->Release();
psRender->Release();
ssaoTex->Release();
}
}