|
@@ -55,43 +55,18 @@ Error Refl::init(const ConfigSet& config)
|
|
|
//==============================================================================
|
|
//==============================================================================
|
|
|
Error Refl::initInternal(const ConfigSet& config)
|
|
Error Refl::initInternal(const ConfigSet& config)
|
|
|
{
|
|
{
|
|
|
- m_irEnabled = config.getNumber("ir.enabled");
|
|
|
|
|
- m_sslrEnabled = config.getNumber("sslr.enabled");
|
|
|
|
|
-
|
|
|
|
|
- m_enabled = m_irEnabled || m_sslrEnabled;
|
|
|
|
|
- if(!m_enabled)
|
|
|
|
|
- {
|
|
|
|
|
- return ErrorCode::NONE;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ m_sslrEnabled = config.getNumber("sslr.enabled") && m_r->getIrEnabled();
|
|
|
|
|
|
|
|
// Size
|
|
// Size
|
|
|
m_width = m_r->getWidth() / 2;
|
|
m_width = m_r->getWidth() / 2;
|
|
|
m_height = m_r->getHeight() / 2;
|
|
m_height = m_r->getHeight() / 2;
|
|
|
- ANKI_ASSERT(isAligned(Renderer::TILE_SIZE, m_width)
|
|
|
|
|
- && isAligned(Renderer::TILE_SIZE, m_height));
|
|
|
|
|
-
|
|
|
|
|
- // IR
|
|
|
|
|
- if(m_irEnabled)
|
|
|
|
|
- {
|
|
|
|
|
- m_ir.reset(getAllocator().newInstance<Ir>(m_r));
|
|
|
|
|
- ANKI_CHECK(m_ir->init(config));
|
|
|
|
|
- }
|
|
|
|
|
|
|
|
|
|
// Continue
|
|
// Continue
|
|
|
- ANKI_CHECK(init1stPass(config));
|
|
|
|
|
- ANKI_CHECK(init2ndPass());
|
|
|
|
|
-
|
|
|
|
|
- return ErrorCode::NONE;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-//==============================================================================
|
|
|
|
|
-Error Refl::init1stPass(const ConfigSet& config)
|
|
|
|
|
-{
|
|
|
|
|
GrManager& gr = getGrManager();
|
|
GrManager& gr = getGrManager();
|
|
|
|
|
|
|
|
// Create shader
|
|
// Create shader
|
|
|
StringAuto pps(getFrameAllocator());
|
|
StringAuto pps(getFrameAllocator());
|
|
|
- const PixelFormat& pixFormat = Pps::RT_PIXEL_FORMAT;
|
|
|
|
|
|
|
+ const PixelFormat& pixFormat = Is::RT_PIXEL_FORMAT;
|
|
|
|
|
|
|
|
pps.sprintf("#define WIDTH %u\n"
|
|
pps.sprintf("#define WIDTH %u\n"
|
|
|
"#define HEIGHT %u\n"
|
|
"#define HEIGHT %u\n"
|
|
@@ -104,11 +79,13 @@ Error Refl::init1stPass(const ConfigSet& config)
|
|
|
"#define SSLR_START_ROUGHNESS %f\n",
|
|
"#define SSLR_START_ROUGHNESS %f\n",
|
|
|
m_width,
|
|
m_width,
|
|
|
m_height,
|
|
m_height,
|
|
|
- (m_irEnabled) ? m_ir->getClusterer().getClusterCountX() : 0,
|
|
|
|
|
- (m_irEnabled) ? m_ir->getClusterer().getClusterCountY() : 0,
|
|
|
|
|
|
|
+ (m_r->getIrEnabled()) ? m_r->getIr().getClusterer().getClusterCountX()
|
|
|
|
|
+ : 0,
|
|
|
|
|
+ (m_r->getIrEnabled()) ? m_r->getIr().getClusterer().getClusterCountY()
|
|
|
|
|
+ : 0,
|
|
|
U(m_sslrEnabled),
|
|
U(m_sslrEnabled),
|
|
|
- U(m_irEnabled),
|
|
|
|
|
- (m_irEnabled) ? m_ir->getCubemapArrayMipmapCount() : 0,
|
|
|
|
|
|
|
+ U(m_r->getIrEnabled()),
|
|
|
|
|
+ (m_r->getIrEnabled()) ? m_r->getIr().getCubemapArrayMipmapCount() : 0,
|
|
|
Renderer::TILE_SIZE,
|
|
Renderer::TILE_SIZE,
|
|
|
config.getNumber("sslr.startRoughnes"));
|
|
config.getNumber("sslr.startRoughnes"));
|
|
|
|
|
|
|
@@ -125,10 +102,6 @@ Error Refl::init1stPass(const ConfigSet& config)
|
|
|
m_vert, "shaders/Quad.vert.glsl", pps.toCString(), "r_refl_"));
|
|
m_vert, "shaders/Quad.vert.glsl", pps.toCString(), "r_refl_"));
|
|
|
|
|
|
|
|
// Create ppline
|
|
// Create ppline
|
|
|
- ColorStateInfo colorState;
|
|
|
|
|
- colorState.m_attachmentCount = 1;
|
|
|
|
|
- colorState.m_attachments[0].m_format = pixFormat;
|
|
|
|
|
-
|
|
|
|
|
PipelineInitializer ppinit;
|
|
PipelineInitializer ppinit;
|
|
|
ppinit.m_color.m_attachmentCount = 1;
|
|
ppinit.m_color.m_attachmentCount = 1;
|
|
|
ppinit.m_color.m_attachments[0].m_format = pixFormat;
|
|
ppinit.m_color.m_attachments[0].m_format = pixFormat;
|
|
@@ -140,11 +113,6 @@ Error Refl::init1stPass(const ConfigSet& config)
|
|
|
|
|
|
|
|
m_ppline = gr.newInstance<Pipeline>(ppinit);
|
|
m_ppline = gr.newInstance<Pipeline>(ppinit);
|
|
|
|
|
|
|
|
- // Create uniform buffer
|
|
|
|
|
- m_uniforms = getGrManager().newInstance<Buffer>(sizeof(ReflUniforms),
|
|
|
|
|
- BufferUsageBit::UNIFORM,
|
|
|
|
|
- BufferAccessBit::CLIENT_WRITE);
|
|
|
|
|
-
|
|
|
|
|
// Create RC group
|
|
// Create RC group
|
|
|
ResourceGroupInitializer rcInit;
|
|
ResourceGroupInitializer rcInit;
|
|
|
|
|
|
|
@@ -167,19 +135,22 @@ Error Refl::init1stPass(const ConfigSet& config)
|
|
|
rcInit.m_textures[4].m_texture = m_r->getIs().getRt();
|
|
rcInit.m_textures[4].m_texture = m_r->getIs().getRt();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if(m_irEnabled)
|
|
|
|
|
|
|
+ if(m_r->getIrEnabled())
|
|
|
{
|
|
{
|
|
|
- rcInit.m_textures[5].m_texture = m_ir->getEnvironmentCubemapArray();
|
|
|
|
|
|
|
+ rcInit.m_textures[5].m_texture =
|
|
|
|
|
+ m_r->getIr().getEnvironmentCubemapArray();
|
|
|
|
|
|
|
|
- rcInit.m_textures[6].m_texture = m_ir->getIrradianceCubemapArray();
|
|
|
|
|
|
|
+ rcInit.m_textures[6].m_texture =
|
|
|
|
|
+ m_r->getIr().getIrradianceCubemapArray();
|
|
|
|
|
|
|
|
- rcInit.m_textures[7].m_texture = m_ir->getIntegrationLut();
|
|
|
|
|
- rcInit.m_textures[7].m_sampler = m_ir->getIntegrationLutSampler();
|
|
|
|
|
|
|
+ rcInit.m_textures[7].m_texture = m_r->getIr().getIntegrationLut();
|
|
|
|
|
+ rcInit.m_textures[7].m_sampler =
|
|
|
|
|
+ m_r->getIr().getIntegrationLutSampler();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- rcInit.m_uniformBuffers[0].m_buffer = m_uniforms;
|
|
|
|
|
|
|
+ rcInit.m_uniformBuffers[0].m_dynamic = true;
|
|
|
|
|
|
|
|
- if(m_irEnabled)
|
|
|
|
|
|
|
+ if(m_r->getIrEnabled())
|
|
|
{
|
|
{
|
|
|
rcInit.m_storageBuffers[0].m_dynamic = true;
|
|
rcInit.m_storageBuffers[0].m_dynamic = true;
|
|
|
rcInit.m_storageBuffers[1].m_dynamic = true;
|
|
rcInit.m_storageBuffers[1].m_dynamic = true;
|
|
@@ -216,154 +187,31 @@ Error Refl::init1stPass(const ConfigSet& config)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
//==============================================================================
|
|
//==============================================================================
|
|
|
-Error Refl::init2ndPass()
|
|
|
|
|
|
|
+void Refl::run(CommandBufferPtr cmdb)
|
|
|
{
|
|
{
|
|
|
- GrManager& gr = getGrManager();
|
|
|
|
|
-
|
|
|
|
|
- // Create RC group
|
|
|
|
|
- ResourceGroupInitializer rcInit;
|
|
|
|
|
- SamplerInitializer sinit;
|
|
|
|
|
- sinit.m_repeat = false;
|
|
|
|
|
-
|
|
|
|
|
- rcInit.m_textures[0].m_texture = m_r->getMs().getDepthRt();
|
|
|
|
|
-
|
|
|
|
|
- sinit.m_minLod = 1.0;
|
|
|
|
|
- sinit.m_mipmapFilter = SamplingFilter::NEAREST;
|
|
|
|
|
- rcInit.m_textures[1].m_texture = m_r->getMs().getDepthRt();
|
|
|
|
|
- rcInit.m_textures[1].m_sampler = gr.newInstance<Sampler>(sinit);
|
|
|
|
|
-
|
|
|
|
|
- sinit.m_minLod = 0.0;
|
|
|
|
|
- rcInit.m_textures[2].m_texture = m_rt;
|
|
|
|
|
- rcInit.m_textures[2].m_sampler = gr.newInstance<Sampler>(sinit);
|
|
|
|
|
-
|
|
|
|
|
- sinit.m_minMagFilter = SamplingFilter::LINEAR;
|
|
|
|
|
- rcInit.m_textures[3].m_texture = m_rt;
|
|
|
|
|
- rcInit.m_textures[3].m_sampler = gr.newInstance<Sampler>(sinit);
|
|
|
|
|
-
|
|
|
|
|
- rcInit.m_uniformBuffers[0].m_dynamic = true;
|
|
|
|
|
-
|
|
|
|
|
- m_blitRcGroup = getGrManager().newInstance<ResourceGroup>(rcInit);
|
|
|
|
|
-
|
|
|
|
|
- // Shader
|
|
|
|
|
- StringAuto pps(getFrameAllocator());
|
|
|
|
|
- pps.sprintf("#define TEXTURE_WIDTH %uu\n"
|
|
|
|
|
- "#define TEXTURE_HEIGHT %uu\n",
|
|
|
|
|
- m_width,
|
|
|
|
|
- m_height);
|
|
|
|
|
-
|
|
|
|
|
- ANKI_CHECK(getResourceManager().loadResourceToCache(m_blitFrag,
|
|
|
|
|
- "shaders/NearDepthUpscale.frag.glsl",
|
|
|
|
|
- pps.toCString(),
|
|
|
|
|
- "r_refl_"));
|
|
|
|
|
-
|
|
|
|
|
- ANKI_CHECK(getResourceManager().loadResourceToCache(m_blitVert,
|
|
|
|
|
- "shaders/NearDepthUpscale.vert.glsl",
|
|
|
|
|
- pps.toCString(),
|
|
|
|
|
- "r_refl_"));
|
|
|
|
|
-
|
|
|
|
|
- // Ppline
|
|
|
|
|
- PipelineInitializer ppinit;
|
|
|
|
|
-
|
|
|
|
|
- ppinit.m_inputAssembler.m_topology = PrimitiveTopology::TRIANGLE_STRIP;
|
|
|
|
|
-
|
|
|
|
|
- ppinit.m_depthStencil.m_depthWriteEnabled = false;
|
|
|
|
|
- ppinit.m_depthStencil.m_depthCompareFunction = CompareOperation::ALWAYS;
|
|
|
|
|
-
|
|
|
|
|
- ppinit.m_color.m_attachmentCount = 1;
|
|
|
|
|
- ppinit.m_color.m_attachments[0].m_format = Is::RT_PIXEL_FORMAT;
|
|
|
|
|
- // ppinit.m_color.m_attachments[0].m_srcBlendMethod = BlendMethod::ONE;
|
|
|
|
|
- // ppinit.m_color.m_attachments[0].m_dstBlendMethod = BlendMethod::ONE;
|
|
|
|
|
-
|
|
|
|
|
- ppinit.m_shaders[U(ShaderType::VERTEX)] = m_blitVert->getGrShader();
|
|
|
|
|
- ppinit.m_shaders[U(ShaderType::FRAGMENT)] = m_blitFrag->getGrShader();
|
|
|
|
|
- m_blitPpline = gr.newInstance<Pipeline>(ppinit);
|
|
|
|
|
-
|
|
|
|
|
- // Create FB
|
|
|
|
|
- FramebufferInitializer fbInit;
|
|
|
|
|
- fbInit.m_colorAttachmentsCount = 1;
|
|
|
|
|
- fbInit.m_colorAttachments[0].m_texture = m_r->getIs().getRt();
|
|
|
|
|
- fbInit.m_colorAttachments[0].m_loadOperation =
|
|
|
|
|
- AttachmentLoadOperation::LOAD;
|
|
|
|
|
- m_isFb = getGrManager().newInstance<Framebuffer>(fbInit);
|
|
|
|
|
-
|
|
|
|
|
- return ErrorCode::NONE;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-//==============================================================================
|
|
|
|
|
-Error Refl::run1(CommandBufferPtr cmdb)
|
|
|
|
|
-{
|
|
|
|
|
- ANKI_ASSERT(m_enabled);
|
|
|
|
|
- return m_ir->run(cmdb);
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-//==============================================================================
|
|
|
|
|
-void Refl::run2(CommandBufferPtr cmdb)
|
|
|
|
|
-{
|
|
|
|
|
- ANKI_ASSERT(m_enabled);
|
|
|
|
|
-
|
|
|
|
|
- // Compute the reflection
|
|
|
|
|
- //
|
|
|
|
|
- writeUniforms(cmdb);
|
|
|
|
|
-
|
|
|
|
|
cmdb->bindFramebuffer(m_fb);
|
|
cmdb->bindFramebuffer(m_fb);
|
|
|
cmdb->setViewport(0, 0, m_width, m_height);
|
|
cmdb->setViewport(0, 0, m_width, m_height);
|
|
|
cmdb->bindPipeline(m_ppline);
|
|
cmdb->bindPipeline(m_ppline);
|
|
|
|
|
|
|
|
DynamicBufferInfo dyn;
|
|
DynamicBufferInfo dyn;
|
|
|
- DynamicBufferInfo* pdyn = nullptr;
|
|
|
|
|
- if(m_irEnabled)
|
|
|
|
|
|
|
+ if(m_r->getIrEnabled())
|
|
|
{
|
|
{
|
|
|
- dyn.m_storageBuffers[0] = m_ir->getProbesToken();
|
|
|
|
|
- dyn.m_storageBuffers[1] = m_ir->getProbeIndicesToken();
|
|
|
|
|
- dyn.m_storageBuffers[2] = m_ir->getClustersToken();
|
|
|
|
|
- pdyn = &dyn;
|
|
|
|
|
|
|
+ dyn.m_storageBuffers[0] = m_r->getIr().getProbesToken();
|
|
|
|
|
+ dyn.m_storageBuffers[1] = m_r->getIr().getProbeIndicesToken();
|
|
|
|
|
+ dyn.m_storageBuffers[2] = m_r->getIr().getClustersToken();
|
|
|
};
|
|
};
|
|
|
- cmdb->bindResourceGroup(m_rcGroup, 0, pdyn);
|
|
|
|
|
-
|
|
|
|
|
- m_r->drawQuad(cmdb);
|
|
|
|
|
-
|
|
|
|
|
- // Write the reflection back to IS RT
|
|
|
|
|
- //
|
|
|
|
|
- DynamicBufferToken token;
|
|
|
|
|
- Vec4* linearDepth =
|
|
|
|
|
- static_cast<Vec4*>(getGrManager().allocateFrameHostVisibleMemory(
|
|
|
|
|
- sizeof(Vec4), BufferUsage::UNIFORM, token));
|
|
|
|
|
- const Frustum& fr = m_r->getActiveFrustumComponent().getFrustum();
|
|
|
|
|
- computeLinearizeDepthOptimal(
|
|
|
|
|
- fr.getNear(), fr.getFar(), linearDepth->x(), linearDepth->y());
|
|
|
|
|
-
|
|
|
|
|
- DynamicBufferInfo dyn1;
|
|
|
|
|
- dyn1.m_uniformBuffers[0] = token;
|
|
|
|
|
-
|
|
|
|
|
- cmdb->bindFramebuffer(m_isFb);
|
|
|
|
|
- cmdb->bindPipeline(m_blitPpline);
|
|
|
|
|
- cmdb->setViewport(0, 0, m_r->getWidth(), m_r->getHeight());
|
|
|
|
|
- cmdb->bindResourceGroup(m_blitRcGroup, 0, &dyn1);
|
|
|
|
|
-
|
|
|
|
|
- m_r->drawQuad(cmdb);
|
|
|
|
|
-}
|
|
|
|
|
|
|
|
|
|
-//==============================================================================
|
|
|
|
|
-void Refl::writeUniforms(CommandBufferPtr cmdb)
|
|
|
|
|
-{
|
|
|
|
|
const FrustumComponent& frc = m_r->getActiveFrustumComponent();
|
|
const FrustumComponent& frc = m_r->getActiveFrustumComponent();
|
|
|
|
|
+ ReflUniforms* blk = static_cast<ReflUniforms*>(
|
|
|
|
|
+ getGrManager().allocateFrameHostVisibleMemory(sizeof(ReflUniforms),
|
|
|
|
|
+ BufferUsage::UNIFORM,
|
|
|
|
|
+ dyn.m_uniformBuffers[0]));
|
|
|
|
|
+ blk->m_projectionParams = m_r->getProjectionParameters();
|
|
|
|
|
+ blk->m_projectionMat = frc.getProjectionMatrix();
|
|
|
|
|
|
|
|
- if(m_uniformsUpdateTimestamp < m_r->getProjectionParametersUpdateTimestamp()
|
|
|
|
|
- || m_uniformsUpdateTimestamp < frc.getTimestamp()
|
|
|
|
|
- || m_uniformsUpdateTimestamp == 0)
|
|
|
|
|
- {
|
|
|
|
|
- DynamicBufferToken token;
|
|
|
|
|
- ReflUniforms* blk = static_cast<ReflUniforms*>(
|
|
|
|
|
- getGrManager().allocateFrameHostVisibleMemory(
|
|
|
|
|
- sizeof(ReflUniforms), BufferUsage::TRANSFER, token));
|
|
|
|
|
|
|
+ cmdb->bindResourceGroup(m_rcGroup, 0, &dyn);
|
|
|
|
|
|
|
|
- blk->m_projectionParams = m_r->getProjectionParameters();
|
|
|
|
|
- blk->m_projectionMat = frc.getProjectionMatrix();
|
|
|
|
|
-
|
|
|
|
|
- cmdb->writeBuffer(m_uniforms, 0, token);
|
|
|
|
|
-
|
|
|
|
|
- m_uniformsUpdateTimestamp = getGlobalTimestamp();
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ m_r->drawQuad(cmdb);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
} // end namespace anki
|
|
} // end namespace anki
|