|
@@ -24,18 +24,26 @@ Error Ssao::initMain(const ConfigSet& config)
|
|
|
ANKI_CHECK(getResourceManager().loadResource("engine_data/BlueNoiseLdrRgb64x64.ankitex", m_main.m_noiseTex));
|
|
ANKI_CHECK(getResourceManager().loadResource("engine_data/BlueNoiseLdrRgb64x64.ankitex", m_main.m_noiseTex));
|
|
|
|
|
|
|
|
// Shader
|
|
// Shader
|
|
|
- ANKI_CHECK(getResourceManager().loadResource("programs/Ssao.ankiprog", m_main.m_prog));
|
|
|
|
|
|
|
+ if(m_useCompute)
|
|
|
|
|
+ {
|
|
|
|
|
+ ANKI_CHECK(getResourceManager().loadResource("programs/SsaoCompute.ankiprog", m_main.m_prog));
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ ANKI_CHECK(getResourceManager().loadResource("programs/Ssao.ankiprog", m_main.m_prog));
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
ShaderProgramResourceMutationInitList<1> mutators(m_main.m_prog);
|
|
ShaderProgramResourceMutationInitList<1> mutators(m_main.m_prog);
|
|
|
- mutators.add("USE_NORMAL", 0u);
|
|
|
|
|
|
|
+ mutators.add("USE_NORMAL", (m_useNormal) ? 1u : 0u);
|
|
|
|
|
|
|
|
- ShaderProgramResourceConstantValueInitList<6> consts(m_main.m_prog);
|
|
|
|
|
|
|
+ ShaderProgramResourceConstantValueInitList<7> consts(m_main.m_prog);
|
|
|
consts.add("NOISE_MAP_SIZE", U32(m_main.m_noiseTex->getWidth()))
|
|
consts.add("NOISE_MAP_SIZE", U32(m_main.m_noiseTex->getWidth()))
|
|
|
.add("FB_SIZE", UVec2(m_width, m_height))
|
|
.add("FB_SIZE", UVec2(m_width, m_height))
|
|
|
.add("RADIUS", 2.5f)
|
|
.add("RADIUS", 2.5f)
|
|
|
.add("BIAS", 0.0f)
|
|
.add("BIAS", 0.0f)
|
|
|
.add("STRENGTH", 2.5f)
|
|
.add("STRENGTH", 2.5f)
|
|
|
- .add("SAMPLE_COUNT", 4u);
|
|
|
|
|
|
|
+ .add("SAMPLE_COUNT", 4u)
|
|
|
|
|
+ .add("WORKGROUP_SIZE", UVec2(m_workgroupSize[0], m_workgroupSize[1]));
|
|
|
const ShaderProgramResourceVariant* variant;
|
|
const ShaderProgramResourceVariant* variant;
|
|
|
m_main.m_prog->getOrCreateVariant(mutators.get(), consts.get(), variant);
|
|
m_main.m_prog->getOrCreateVariant(mutators.get(), consts.get(), variant);
|
|
|
m_main.m_grProg = variant->getProgram();
|
|
m_main.m_grProg = variant->getProgram();
|
|
@@ -87,12 +95,20 @@ Error Ssao::init(const ConfigSet& config)
|
|
|
ANKI_R_LOGI("Initializing SSAO. Size %ux%u", m_width, m_height);
|
|
ANKI_R_LOGI("Initializing SSAO. Size %ux%u", m_width, m_height);
|
|
|
|
|
|
|
|
// RT
|
|
// RT
|
|
|
- m_rtDescr = m_r->create2DRenderTargetDescription(m_width,
|
|
|
|
|
|
|
+ m_rtDescrs[0] = m_r->create2DRenderTargetDescription(m_width,
|
|
|
|
|
+ m_height,
|
|
|
|
|
+ Ssao::RT_PIXEL_FORMAT,
|
|
|
|
|
+ TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE
|
|
|
|
|
+ | ((m_useCompute) ? TextureUsageBit::IMAGE_COMPUTE_WRITE : TextureUsageBit::NONE),
|
|
|
|
|
+ "SSAO_0");
|
|
|
|
|
+ m_rtDescrs[0].bake();
|
|
|
|
|
+
|
|
|
|
|
+ m_rtDescrs[1] = m_r->create2DRenderTargetDescription(m_width,
|
|
|
m_height,
|
|
m_height,
|
|
|
Ssao::RT_PIXEL_FORMAT,
|
|
Ssao::RT_PIXEL_FORMAT,
|
|
|
- TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE | TextureUsageBit::CLEAR,
|
|
|
|
|
- "SSAO");
|
|
|
|
|
- m_rtDescr.bake();
|
|
|
|
|
|
|
+ TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
|
|
|
|
|
+ "SSAO_1");
|
|
|
|
|
+ m_rtDescrs[1].bake();
|
|
|
|
|
|
|
|
// FB descr
|
|
// FB descr
|
|
|
m_fbDescr.m_colorAttachmentCount = 1;
|
|
m_fbDescr.m_colorAttachmentCount = 1;
|
|
@@ -123,7 +139,6 @@ void Ssao::runMain(const RenderingContext& ctx, RenderPassWorkContext& rgraphCtx
|
|
|
{
|
|
{
|
|
|
CommandBufferPtr& cmdb = rgraphCtx.m_commandBuffer;
|
|
CommandBufferPtr& cmdb = rgraphCtx.m_commandBuffer;
|
|
|
|
|
|
|
|
- cmdb->setViewport(0, 0, m_width, m_height);
|
|
|
|
|
cmdb->bindShaderProgram(m_main.m_grProg);
|
|
cmdb->bindShaderProgram(m_main.m_grProg);
|
|
|
|
|
|
|
|
rgraphCtx.bindTextureAndSampler(
|
|
rgraphCtx.bindTextureAndSampler(
|
|
@@ -134,6 +149,11 @@ void Ssao::runMain(const RenderingContext& ctx, RenderPassWorkContext& rgraphCtx
|
|
|
m_r->getTrilinearRepeatSampler(),
|
|
m_r->getTrilinearRepeatSampler(),
|
|
|
TextureUsageBit::SAMPLED_FRAGMENT);
|
|
TextureUsageBit::SAMPLED_FRAGMENT);
|
|
|
|
|
|
|
|
|
|
+ if(m_useNormal)
|
|
|
|
|
+ {
|
|
|
|
|
+ rgraphCtx.bindColorTextureAndSampler(0, 2, m_r->getGBuffer().getColorRt(2), m_r->getLinearSampler());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
struct Unis
|
|
struct Unis
|
|
|
{
|
|
{
|
|
|
Vec4 m_unprojectionParams;
|
|
Vec4 m_unprojectionParams;
|
|
@@ -147,7 +167,19 @@ void Ssao::runMain(const RenderingContext& ctx, RenderPassWorkContext& rgraphCtx
|
|
|
unis->m_projectionMat = Vec4(pmat(0, 0), pmat(1, 1), pmat(2, 2), pmat(2, 3));
|
|
unis->m_projectionMat = Vec4(pmat(0, 0), pmat(1, 1), pmat(2, 2), pmat(2, 3));
|
|
|
unis->m_viewRotMat = Mat3x4(ctx.m_renderQueue->m_viewMatrix.getRotationPart());
|
|
unis->m_viewRotMat = Mat3x4(ctx.m_renderQueue->m_viewMatrix.getRotationPart());
|
|
|
|
|
|
|
|
- drawQuad(cmdb);
|
|
|
|
|
|
|
+ if(m_useCompute)
|
|
|
|
|
+ {
|
|
|
|
|
+ rgraphCtx.bindImage(0, 0, m_runCtx.m_rts[0], TextureSubresourceInfo());
|
|
|
|
|
+
|
|
|
|
|
+ const U sizeX = (m_width + m_workgroupSize[0] - 1) / m_workgroupSize[0];
|
|
|
|
|
+ const U sizeY = (m_height + m_workgroupSize[1] - 1) / m_workgroupSize[1];
|
|
|
|
|
+ cmdb->dispatchCompute(sizeX, sizeY, 1);
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ cmdb->setViewport(0, 0, m_width, m_height);
|
|
|
|
|
+ drawQuad(cmdb);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void Ssao::runHBlur(RenderPassWorkContext& rgraphCtx)
|
|
void Ssao::runHBlur(RenderPassWorkContext& rgraphCtx)
|
|
@@ -180,20 +212,45 @@ void Ssao::populateRenderGraph(RenderingContext& ctx)
|
|
|
RenderGraphDescription& rgraph = ctx.m_renderGraphDescr;
|
|
RenderGraphDescription& rgraph = ctx.m_renderGraphDescr;
|
|
|
|
|
|
|
|
// Create RTs
|
|
// Create RTs
|
|
|
- m_runCtx.m_rts[0] = rgraph.newRenderTarget(m_rtDescr);
|
|
|
|
|
- m_runCtx.m_rts[1] = rgraph.newRenderTarget(m_rtDescr);
|
|
|
|
|
|
|
+ m_runCtx.m_rts[0] = rgraph.newRenderTarget(m_rtDescrs[0]);
|
|
|
|
|
+ m_runCtx.m_rts[1] = rgraph.newRenderTarget(m_rtDescrs[1]);
|
|
|
|
|
|
|
|
// Create main render pass
|
|
// Create main render pass
|
|
|
{
|
|
{
|
|
|
- GraphicsRenderPassDescription& pass = rgraph.newGraphicsRenderPass("SSAO main");
|
|
|
|
|
-
|
|
|
|
|
- pass.setWork(runMainCallback, this, 0);
|
|
|
|
|
- pass.setFramebufferInfo(m_fbDescr, {{m_runCtx.m_rts[0]}}, {});
|
|
|
|
|
-
|
|
|
|
|
- pass.newConsumer({m_r->getGBuffer().getColorRt(2), TextureUsageBit::SAMPLED_FRAGMENT});
|
|
|
|
|
- pass.newConsumer({m_r->getDepthDownscale().getHiZRt(), TextureUsageBit::SAMPLED_FRAGMENT, HIZ_QUARTER_DEPTH});
|
|
|
|
|
- pass.newConsumer({m_runCtx.m_rts[0], TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
|
|
|
|
|
- pass.newProducer({m_runCtx.m_rts[0], TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
|
|
|
|
|
|
|
+ if(m_useCompute)
|
|
|
|
|
+ {
|
|
|
|
|
+ ComputeRenderPassDescription& pass = rgraph.newComputeRenderPass("SSAO main");
|
|
|
|
|
+
|
|
|
|
|
+ if(m_useNormal)
|
|
|
|
|
+ {
|
|
|
|
|
+ pass.newConsumer({m_r->getGBuffer().getColorRt(2), TextureUsageBit::SAMPLED_COMPUTE});
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ pass.newConsumer(
|
|
|
|
|
+ {m_r->getDepthDownscale().getHiZRt(), TextureUsageBit::SAMPLED_COMPUTE, HIZ_QUARTER_DEPTH});
|
|
|
|
|
+ pass.newConsumer({m_runCtx.m_rts[0], TextureUsageBit::IMAGE_COMPUTE_WRITE});
|
|
|
|
|
+ pass.newProducer({m_runCtx.m_rts[0], TextureUsageBit::IMAGE_COMPUTE_WRITE});
|
|
|
|
|
+
|
|
|
|
|
+ pass.setWork(runMainCallback, this, 0);
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ GraphicsRenderPassDescription& pass = rgraph.newGraphicsRenderPass("SSAO main");
|
|
|
|
|
+
|
|
|
|
|
+ pass.setFramebufferInfo(m_fbDescr, {{m_runCtx.m_rts[0]}}, {});
|
|
|
|
|
+
|
|
|
|
|
+ if(m_useNormal)
|
|
|
|
|
+ {
|
|
|
|
|
+ pass.newConsumer({m_r->getGBuffer().getColorRt(2), TextureUsageBit::SAMPLED_FRAGMENT});
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ pass.newConsumer(
|
|
|
|
|
+ {m_r->getDepthDownscale().getHiZRt(), TextureUsageBit::SAMPLED_FRAGMENT, HIZ_QUARTER_DEPTH});
|
|
|
|
|
+ pass.newConsumer({m_runCtx.m_rts[0], TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
|
|
|
|
|
+ pass.newProducer({m_runCtx.m_rts[0], TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE});
|
|
|
|
|
+
|
|
|
|
|
+ pass.setWork(runMainCallback, this, 0);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// Create HBlur pass
|
|
// Create HBlur pass
|