|
@@ -14,6 +14,9 @@
|
|
|
namespace anki
|
|
namespace anki
|
|
|
{
|
|
{
|
|
|
|
|
|
|
|
|
|
+static constexpr U32 WRITE = 0;
|
|
|
|
|
+static constexpr U32 READ = 1;
|
|
|
|
|
+
|
|
|
Ssgi::~Ssgi()
|
|
Ssgi::~Ssgi()
|
|
|
{
|
|
{
|
|
|
}
|
|
}
|
|
@@ -32,56 +35,78 @@ Error Ssgi::initInternal(const ConfigSet& cfg)
|
|
|
{
|
|
{
|
|
|
const U32 width = m_r->getWidth();
|
|
const U32 width = m_r->getWidth();
|
|
|
const U32 height = m_r->getHeight();
|
|
const U32 height = m_r->getHeight();
|
|
|
- ANKI_R_LOGI("Initializing SSGI pass (%ux%u)", width, height);
|
|
|
|
|
|
|
+ ANKI_ASSERT((width % 2) == 0 && (height % 2) == 0 && "The algorithms won't work");
|
|
|
|
|
+ ANKI_R_LOGI("Initializing SSGI pass");
|
|
|
m_main.m_maxSteps = cfg.getNumberU32("r_ssgiMaxSteps");
|
|
m_main.m_maxSteps = cfg.getNumberU32("r_ssgiMaxSteps");
|
|
|
m_main.m_depthLod = min(cfg.getNumberU32("r_ssgiDepthLod"), m_r->getDepthDownscale().getMipmapCount() - 1);
|
|
m_main.m_depthLod = min(cfg.getNumberU32("r_ssgiDepthLod"), m_r->getDepthDownscale().getMipmapCount() - 1);
|
|
|
m_main.m_firstStepPixels = 32;
|
|
m_main.m_firstStepPixels = 32;
|
|
|
|
|
|
|
|
ANKI_CHECK(getResourceManager().loadResource("engine_data/BlueNoiseRgb816x16.png", m_main.m_noiseTex));
|
|
ANKI_CHECK(getResourceManager().loadResource("engine_data/BlueNoiseRgb816x16.png", m_main.m_noiseTex));
|
|
|
|
|
|
|
|
- // Create RTs
|
|
|
|
|
- TextureInitInfo texinit = m_r->create2DRenderTargetInitInfo(width,
|
|
|
|
|
- height,
|
|
|
|
|
- Format::R16G16B16A16_SFLOAT,
|
|
|
|
|
- TextureUsageBit::IMAGE_COMPUTE_WRITE | TextureUsageBit::SAMPLED_ALL,
|
|
|
|
|
- "SSGI");
|
|
|
|
|
- texinit.m_initialUsage = TextureUsageBit::SAMPLED_FRAGMENT;
|
|
|
|
|
- m_main.m_rts[0] = m_r->createAndClearRenderTarget(texinit);
|
|
|
|
|
- m_main.m_rts[1] = m_r->createAndClearRenderTarget(texinit);
|
|
|
|
|
-
|
|
|
|
|
- // Create main shaders
|
|
|
|
|
|
|
+ // Init main
|
|
|
{
|
|
{
|
|
|
|
|
+ m_main.m_rtDescr =
|
|
|
|
|
+ m_r->create2DRenderTargetDescription(width / 2, height / 2, Format::B10G11R11_UFLOAT_PACK32, "SSGI_tmp");
|
|
|
|
|
+ m_main.m_rtDescr.bake();
|
|
|
|
|
+
|
|
|
ANKI_CHECK(getResourceManager().loadResource("shaders/Ssgi.ankiprog", m_main.m_prog));
|
|
ANKI_CHECK(getResourceManager().loadResource("shaders/Ssgi.ankiprog", m_main.m_prog));
|
|
|
|
|
|
|
|
ShaderProgramResourceVariantInitInfo variantInitInfo(m_main.m_prog);
|
|
ShaderProgramResourceVariantInitInfo variantInitInfo(m_main.m_prog);
|
|
|
- variantInitInfo.addMutation("VARIANT", 0);
|
|
|
|
|
|
|
|
|
|
- const ShaderProgramResourceVariant* variant;
|
|
|
|
|
- m_main.m_prog->getOrCreateVariant(variantInitInfo, variant);
|
|
|
|
|
- m_main.m_grProg[0] = variant->getProgram();
|
|
|
|
|
|
|
+ for(U32 i = 0; i < 4; ++i)
|
|
|
|
|
+ {
|
|
|
|
|
+ variantInitInfo.addMutation("VARIANT", i);
|
|
|
|
|
|
|
|
- variantInitInfo.addMutation("VARIANT", 1);
|
|
|
|
|
- m_main.m_prog->getOrCreateVariant(variantInitInfo, variant);
|
|
|
|
|
- m_main.m_grProg[1] = variant->getProgram();
|
|
|
|
|
|
|
+ const ShaderProgramResourceVariant* variant;
|
|
|
|
|
+ m_main.m_prog->getOrCreateVariant(variantInitInfo, variant);
|
|
|
|
|
+ m_main.m_grProg[i] = variant->getProgram();
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// Init denoise
|
|
// Init denoise
|
|
|
{
|
|
{
|
|
|
- ANKI_CHECK(getResourceManager().loadResource("shaders/DepthAwareBlurCompute.ankiprog", m_denoise.m_prog));
|
|
|
|
|
|
|
+ ANKI_CHECK(getResourceManager().loadResource("shaders/SsgiDenoise.ankiprog", m_denoise.m_prog));
|
|
|
ShaderProgramResourceVariantInitInfo variantInitInfo(m_denoise.m_prog);
|
|
ShaderProgramResourceVariantInitInfo variantInitInfo(m_denoise.m_prog);
|
|
|
const ShaderProgramResourceVariant* variant;
|
|
const ShaderProgramResourceVariant* variant;
|
|
|
|
|
|
|
|
- variantInitInfo.addConstant("TEXTURE_SIZE", UVec2(m_r->getWidth(), m_r->getHeight()));
|
|
|
|
|
|
|
+ variantInitInfo.addConstant("IN_TEXTURE_SIZE", UVec2(width / 2, height / 2));
|
|
|
|
|
|
|
|
- variantInitInfo.addMutation("SAMPLE_COUNT", 15);
|
|
|
|
|
- variantInitInfo.addMutation("COLOR_COMPONENTS", 4);
|
|
|
|
|
- variantInitInfo.addMutation("ORIENTATION", 0);
|
|
|
|
|
- m_denoise.m_prog->getOrCreateVariant(variantInitInfo, variant);
|
|
|
|
|
- m_denoise.m_grProg[0] = variant->getProgram();
|
|
|
|
|
|
|
+ for(U32 i = 0; i < 4; ++i)
|
|
|
|
|
+ {
|
|
|
|
|
+ variantInitInfo.addMutation("VARIANT", i);
|
|
|
|
|
+
|
|
|
|
|
+ variantInitInfo.addMutation("SAMPLE_COUNT", 11);
|
|
|
|
|
+ variantInitInfo.addMutation("ORIENTATION", 0);
|
|
|
|
|
+ m_denoise.m_prog->getOrCreateVariant(variantInitInfo, variant);
|
|
|
|
|
+ m_denoise.m_grProg[0][i] = variant->getProgram();
|
|
|
|
|
|
|
|
- variantInitInfo.addMutation("ORIENTATION", 1);
|
|
|
|
|
- m_denoise.m_prog->getOrCreateVariant(variantInitInfo, variant);
|
|
|
|
|
- m_denoise.m_grProg[1] = variant->getProgram();
|
|
|
|
|
|
|
+ variantInitInfo.addMutation("SAMPLE_COUNT", 15);
|
|
|
|
|
+ variantInitInfo.addMutation("ORIENTATION", 1);
|
|
|
|
|
+ m_denoise.m_prog->getOrCreateVariant(variantInitInfo, variant);
|
|
|
|
|
+ m_denoise.m_grProg[1][i] = variant->getProgram();
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // Init reconstruction
|
|
|
|
|
+ {
|
|
|
|
|
+ ANKI_CHECK(getResourceManager().loadResource("shaders/SsgiReconstruct.ankiprog", m_recontruction.m_prog));
|
|
|
|
|
+ ShaderProgramResourceVariantInitInfo variantInitInfo(m_recontruction.m_prog);
|
|
|
|
|
+ variantInitInfo.addConstant("FB_SIZE", UVec2(m_r->getWidth(), m_r->getHeight()));
|
|
|
|
|
+ const ShaderProgramResourceVariant* variant;
|
|
|
|
|
+
|
|
|
|
|
+ for(U32 i = 0; i < 4; ++i)
|
|
|
|
|
+ {
|
|
|
|
|
+ variantInitInfo.addMutation("VARIANT", i);
|
|
|
|
|
+ m_recontruction.m_prog->getOrCreateVariant(variantInitInfo, variant);
|
|
|
|
|
+ m_recontruction.m_grProg[i] = variant->getProgram();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ const TextureInitInfo initInfo = m_r->create2DRenderTargetInitInfo(width,
|
|
|
|
|
+ height,
|
|
|
|
|
+ Format::B10G11R11_UFLOAT_PACK32,
|
|
|
|
|
+ TextureUsageBit::SAMPLED_ALL | TextureUsageBit::IMAGE_COMPUTE_WRITE,
|
|
|
|
|
+ "SSGI");
|
|
|
|
|
+ m_recontruction.m_rt = m_r->createAndClearRenderTarget(initInfo);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
return Error::NONE;
|
|
return Error::NONE;
|
|
@@ -91,22 +116,21 @@ void Ssgi::populateRenderGraph(RenderingContext& ctx)
|
|
|
{
|
|
{
|
|
|
RenderGraphDescription& rgraph = ctx.m_renderGraphDescr;
|
|
RenderGraphDescription& rgraph = ctx.m_renderGraphDescr;
|
|
|
m_runCtx.m_ctx = &ctx;
|
|
m_runCtx.m_ctx = &ctx;
|
|
|
- m_main.m_writeRtIdx = (m_main.m_writeRtIdx + 1) % 2;
|
|
|
|
|
|
|
|
|
|
// Main pass
|
|
// Main pass
|
|
|
{
|
|
{
|
|
|
// Create RTs
|
|
// Create RTs
|
|
|
- if(ANKI_LIKELY(m_main.m_rtImportedOnce))
|
|
|
|
|
|
|
+ if(ANKI_LIKELY(m_recontruction.m_rtImportedOnce))
|
|
|
{
|
|
{
|
|
|
- m_runCtx.m_rts[0] = rgraph.importRenderTarget(m_main.m_rts[0]);
|
|
|
|
|
- m_runCtx.m_rts[1] = rgraph.importRenderTarget(m_main.m_rts[1]);
|
|
|
|
|
|
|
+ m_runCtx.m_finalRt = rgraph.importRenderTarget(m_recontruction.m_rt);
|
|
|
}
|
|
}
|
|
|
else
|
|
else
|
|
|
{
|
|
{
|
|
|
- m_runCtx.m_rts[0] = rgraph.importRenderTarget(m_main.m_rts[0], TextureUsageBit::SAMPLED_FRAGMENT);
|
|
|
|
|
- m_runCtx.m_rts[1] = rgraph.importRenderTarget(m_main.m_rts[1], TextureUsageBit::SAMPLED_FRAGMENT);
|
|
|
|
|
- m_main.m_rtImportedOnce = true;
|
|
|
|
|
|
|
+ m_runCtx.m_finalRt = rgraph.importRenderTarget(m_recontruction.m_rt, TextureUsageBit::SAMPLED_FRAGMENT);
|
|
|
|
|
+ m_recontruction.m_rtImportedOnce = true;
|
|
|
}
|
|
}
|
|
|
|
|
+ m_runCtx.m_intermediateRts[WRITE] = rgraph.newRenderTarget(m_main.m_rtDescr);
|
|
|
|
|
+ m_runCtx.m_intermediateRts[READ] = rgraph.newRenderTarget(m_main.m_rtDescr);
|
|
|
|
|
|
|
|
// Create pass
|
|
// Create pass
|
|
|
ComputeRenderPassDescription& rpass = rgraph.newComputeRenderPass("SSGI");
|
|
ComputeRenderPassDescription& rpass = rgraph.newComputeRenderPass("SSGI");
|
|
@@ -115,8 +139,8 @@ void Ssgi::populateRenderGraph(RenderingContext& ctx)
|
|
|
this,
|
|
this,
|
|
|
0);
|
|
0);
|
|
|
|
|
|
|
|
- rpass.newDependency({m_runCtx.m_rts[m_main.m_writeRtIdx], TextureUsageBit::IMAGE_COMPUTE_WRITE});
|
|
|
|
|
- rpass.newDependency({m_runCtx.m_rts[!m_main.m_writeRtIdx], TextureUsageBit::SAMPLED_COMPUTE});
|
|
|
|
|
|
|
+ rpass.newDependency({m_runCtx.m_intermediateRts[WRITE], TextureUsageBit::IMAGE_COMPUTE_WRITE});
|
|
|
|
|
+ rpass.newDependency({m_runCtx.m_finalRt, TextureUsageBit::SAMPLED_COMPUTE});
|
|
|
|
|
|
|
|
TextureSubresourceInfo hizSubresource;
|
|
TextureSubresourceInfo hizSubresource;
|
|
|
hizSubresource.m_firstMipmap = m_main.m_depthLod;
|
|
hizSubresource.m_firstMipmap = m_main.m_depthLod;
|
|
@@ -127,10 +151,10 @@ void Ssgi::populateRenderGraph(RenderingContext& ctx)
|
|
|
|
|
|
|
|
// Blur vertical
|
|
// Blur vertical
|
|
|
{
|
|
{
|
|
|
- ComputeRenderPassDescription& rpass = rgraph.newComputeRenderPass("SSGIBlurV");
|
|
|
|
|
|
|
+ ComputeRenderPassDescription& rpass = rgraph.newComputeRenderPass("SSGI_blur_v");
|
|
|
|
|
|
|
|
- rpass.newDependency({m_runCtx.m_rts[m_main.m_writeRtIdx], TextureUsageBit::SAMPLED_COMPUTE});
|
|
|
|
|
- rpass.newDependency({m_runCtx.m_rts[!m_main.m_writeRtIdx], TextureUsageBit::IMAGE_COMPUTE_WRITE});
|
|
|
|
|
|
|
+ rpass.newDependency({m_runCtx.m_intermediateRts[WRITE], TextureUsageBit::SAMPLED_COMPUTE});
|
|
|
|
|
+ rpass.newDependency({m_runCtx.m_intermediateRts[READ], TextureUsageBit::IMAGE_COMPUTE_WRITE});
|
|
|
rpass.newDependency({m_r->getGBuffer().getDepthRt(), TextureUsageBit::SAMPLED_COMPUTE});
|
|
rpass.newDependency({m_r->getGBuffer().getDepthRt(), TextureUsageBit::SAMPLED_COMPUTE});
|
|
|
|
|
|
|
|
rpass.setWork(
|
|
rpass.setWork(
|
|
@@ -141,10 +165,10 @@ void Ssgi::populateRenderGraph(RenderingContext& ctx)
|
|
|
|
|
|
|
|
// Blur horizontal
|
|
// Blur horizontal
|
|
|
{
|
|
{
|
|
|
- ComputeRenderPassDescription& rpass = rgraph.newComputeRenderPass("SSGIBlurH");
|
|
|
|
|
|
|
+ ComputeRenderPassDescription& rpass = rgraph.newComputeRenderPass("SSGI_blur_h");
|
|
|
|
|
|
|
|
- rpass.newDependency({m_runCtx.m_rts[!m_main.m_writeRtIdx], TextureUsageBit::SAMPLED_COMPUTE});
|
|
|
|
|
- rpass.newDependency({m_runCtx.m_rts[m_main.m_writeRtIdx], TextureUsageBit::IMAGE_COMPUTE_WRITE});
|
|
|
|
|
|
|
+ rpass.newDependency({m_runCtx.m_intermediateRts[READ], TextureUsageBit::SAMPLED_COMPUTE});
|
|
|
|
|
+ rpass.newDependency({m_runCtx.m_intermediateRts[WRITE], TextureUsageBit::IMAGE_COMPUTE_WRITE});
|
|
|
rpass.newDependency({m_r->getGBuffer().getDepthRt(), TextureUsageBit::SAMPLED_COMPUTE});
|
|
rpass.newDependency({m_r->getGBuffer().getDepthRt(), TextureUsageBit::SAMPLED_COMPUTE});
|
|
|
|
|
|
|
|
rpass.setWork(
|
|
rpass.setWork(
|
|
@@ -152,15 +176,30 @@ void Ssgi::populateRenderGraph(RenderingContext& ctx)
|
|
|
this,
|
|
this,
|
|
|
0);
|
|
0);
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ // Reconstruction
|
|
|
|
|
+ {
|
|
|
|
|
+ ComputeRenderPassDescription& rpass = rgraph.newComputeRenderPass("SSGI_recon");
|
|
|
|
|
+
|
|
|
|
|
+ rpass.newDependency({m_runCtx.m_intermediateRts[WRITE], TextureUsageBit::SAMPLED_COMPUTE});
|
|
|
|
|
+ rpass.newDependency({m_runCtx.m_finalRt, TextureUsageBit::IMAGE_COMPUTE_WRITE});
|
|
|
|
|
+
|
|
|
|
|
+ rpass.setWork(
|
|
|
|
|
+ [](RenderPassWorkContext& rgraphCtx) {
|
|
|
|
|
+ static_cast<Ssgi*>(rgraphCtx.m_userData)->runRecontruct(rgraphCtx);
|
|
|
|
|
+ },
|
|
|
|
|
+ this,
|
|
|
|
|
+ 0);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void Ssgi::run(RenderPassWorkContext& rgraphCtx)
|
|
void Ssgi::run(RenderPassWorkContext& rgraphCtx)
|
|
|
{
|
|
{
|
|
|
RenderingContext& ctx = *m_runCtx.m_ctx;
|
|
RenderingContext& ctx = *m_runCtx.m_ctx;
|
|
|
CommandBufferPtr& cmdb = rgraphCtx.m_commandBuffer;
|
|
CommandBufferPtr& cmdb = rgraphCtx.m_commandBuffer;
|
|
|
- cmdb->bindShaderProgram(m_main.m_grProg[m_r->getFrameCount() & 1u]);
|
|
|
|
|
|
|
+ cmdb->bindShaderProgram(m_main.m_grProg[m_r->getFrameCount() % 4]);
|
|
|
|
|
|
|
|
- rgraphCtx.bindImage(0, 0, m_runCtx.m_rts[m_main.m_writeRtIdx], TextureSubresourceInfo());
|
|
|
|
|
|
|
+ rgraphCtx.bindImage(0, 0, m_runCtx.m_intermediateRts[WRITE], TextureSubresourceInfo());
|
|
|
|
|
|
|
|
// Bind uniforms
|
|
// Bind uniforms
|
|
|
SsgiUniforms* unis = allocateAndBindUniforms<SsgiUniforms*>(sizeof(SsgiUniforms), cmdb, 0, 1);
|
|
SsgiUniforms* unis = allocateAndBindUniforms<SsgiUniforms*>(sizeof(SsgiUniforms), cmdb, 0, 1);
|
|
@@ -184,36 +223,50 @@ void Ssgi::run(RenderPassWorkContext& rgraphCtx)
|
|
|
rgraphCtx.bindTexture(0, 4, m_r->getDepthDownscale().getHiZRt(), hizSubresource);
|
|
rgraphCtx.bindTexture(0, 4, m_r->getDepthDownscale().getHiZRt(), hizSubresource);
|
|
|
|
|
|
|
|
rgraphCtx.bindColorTexture(0, 5, m_r->getDownscaleBlur().getRt());
|
|
rgraphCtx.bindColorTexture(0, 5, m_r->getDownscaleBlur().getRt());
|
|
|
- rgraphCtx.bindColorTexture(0, 6, m_runCtx.m_rts[!m_main.m_writeRtIdx]);
|
|
|
|
|
|
|
+ rgraphCtx.bindColorTexture(0, 6, m_runCtx.m_finalRt);
|
|
|
|
|
|
|
|
// Dispatch
|
|
// Dispatch
|
|
|
- dispatchPPCompute(cmdb, 16, 16, m_r->getWidth() / 2, m_r->getHeight());
|
|
|
|
|
|
|
+ dispatchPPCompute(cmdb, 16, 16, m_r->getWidth() / 2, m_r->getHeight() / 2);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void Ssgi::runVBlur(RenderPassWorkContext& rgraphCtx)
|
|
void Ssgi::runVBlur(RenderPassWorkContext& rgraphCtx)
|
|
|
{
|
|
{
|
|
|
CommandBufferPtr& cmdb = rgraphCtx.m_commandBuffer;
|
|
CommandBufferPtr& cmdb = rgraphCtx.m_commandBuffer;
|
|
|
- cmdb->bindShaderProgram(m_denoise.m_grProg[0]);
|
|
|
|
|
|
|
+ cmdb->bindShaderProgram(m_denoise.m_grProg[0][m_r->getFrameCount() % 4]);
|
|
|
|
|
|
|
|
cmdb->bindSampler(0, 0, m_r->getSamplers().m_trilinearClamp);
|
|
cmdb->bindSampler(0, 0, m_r->getSamplers().m_trilinearClamp);
|
|
|
- rgraphCtx.bindColorTexture(0, 1, m_runCtx.m_rts[m_main.m_writeRtIdx]);
|
|
|
|
|
|
|
+ rgraphCtx.bindColorTexture(0, 1, m_runCtx.m_intermediateRts[WRITE]);
|
|
|
rgraphCtx.bindTexture(0, 2, m_r->getGBuffer().getDepthRt(), TextureSubresourceInfo(DepthStencilAspectBit::DEPTH));
|
|
rgraphCtx.bindTexture(0, 2, m_r->getGBuffer().getDepthRt(), TextureSubresourceInfo(DepthStencilAspectBit::DEPTH));
|
|
|
|
|
|
|
|
- rgraphCtx.bindImage(0, 3, m_runCtx.m_rts[!m_main.m_writeRtIdx], TextureSubresourceInfo());
|
|
|
|
|
|
|
+ rgraphCtx.bindImage(0, 3, m_runCtx.m_intermediateRts[READ], TextureSubresourceInfo());
|
|
|
|
|
|
|
|
- dispatchPPCompute(cmdb, 8, 8, m_r->getWidth(), m_r->getHeight());
|
|
|
|
|
|
|
+ dispatchPPCompute(cmdb, 8, 8, m_r->getWidth() / 2, m_r->getHeight() / 2);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void Ssgi::runHBlur(RenderPassWorkContext& rgraphCtx)
|
|
void Ssgi::runHBlur(RenderPassWorkContext& rgraphCtx)
|
|
|
{
|
|
{
|
|
|
CommandBufferPtr& cmdb = rgraphCtx.m_commandBuffer;
|
|
CommandBufferPtr& cmdb = rgraphCtx.m_commandBuffer;
|
|
|
- cmdb->bindShaderProgram(m_denoise.m_grProg[1]);
|
|
|
|
|
|
|
+ cmdb->bindShaderProgram(m_denoise.m_grProg[1][m_r->getFrameCount() % 4]);
|
|
|
|
|
+
|
|
|
|
|
+ cmdb->bindSampler(0, 0, m_r->getSamplers().m_trilinearClamp);
|
|
|
|
|
+ rgraphCtx.bindColorTexture(0, 1, m_runCtx.m_intermediateRts[READ]);
|
|
|
|
|
+ rgraphCtx.bindTexture(0, 2, m_r->getGBuffer().getDepthRt(), TextureSubresourceInfo(DepthStencilAspectBit::DEPTH));
|
|
|
|
|
+
|
|
|
|
|
+ rgraphCtx.bindImage(0, 3, m_runCtx.m_intermediateRts[WRITE], TextureSubresourceInfo());
|
|
|
|
|
+
|
|
|
|
|
+ dispatchPPCompute(cmdb, 8, 8, m_r->getWidth() / 2, m_r->getHeight() / 2);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void Ssgi::runRecontruct(RenderPassWorkContext& rgraphCtx)
|
|
|
|
|
+{
|
|
|
|
|
+ CommandBufferPtr& cmdb = rgraphCtx.m_commandBuffer;
|
|
|
|
|
+ cmdb->bindShaderProgram(m_recontruction.m_grProg[m_r->getFrameCount() % 4]);
|
|
|
|
|
|
|
|
cmdb->bindSampler(0, 0, m_r->getSamplers().m_trilinearClamp);
|
|
cmdb->bindSampler(0, 0, m_r->getSamplers().m_trilinearClamp);
|
|
|
- rgraphCtx.bindColorTexture(0, 1, m_runCtx.m_rts[!m_main.m_writeRtIdx]);
|
|
|
|
|
|
|
+ rgraphCtx.bindColorTexture(0, 1, m_runCtx.m_intermediateRts[WRITE]);
|
|
|
rgraphCtx.bindTexture(0, 2, m_r->getGBuffer().getDepthRt(), TextureSubresourceInfo(DepthStencilAspectBit::DEPTH));
|
|
rgraphCtx.bindTexture(0, 2, m_r->getGBuffer().getDepthRt(), TextureSubresourceInfo(DepthStencilAspectBit::DEPTH));
|
|
|
|
|
|
|
|
- rgraphCtx.bindImage(0, 3, m_runCtx.m_rts[m_main.m_writeRtIdx], TextureSubresourceInfo());
|
|
|
|
|
|
|
+ rgraphCtx.bindImage(0, 3, m_runCtx.m_finalRt, TextureSubresourceInfo());
|
|
|
|
|
|
|
|
dispatchPPCompute(cmdb, 8, 8, m_r->getWidth(), m_r->getHeight());
|
|
dispatchPPCompute(cmdb, 8, 8, m_r->getWidth(), m_r->getHeight());
|
|
|
}
|
|
}
|