#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(); } }