101 lines
2.8 KiB
C++
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();
|
||
|
|
}
|
||
|
|
}
|