*
This commit is contained in:
@@ -0,0 +1,101 @@
|
||||
#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();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user