|
|
@@ -67,13 +67,14 @@ Error ProbeReflections::initGBuffer()
|
|
|
|
|
|
// Create RT descriptions
|
|
|
{
|
|
|
- RenderTargetDescription texinit = getRenderer().create2DRenderTargetDescription(m_gbuffer.m_tileSize * 6, m_gbuffer.m_tileSize,
|
|
|
+ RenderTargetDescription texinit = getRenderer().create2DRenderTargetDescription(m_gbuffer.m_tileSize, m_gbuffer.m_tileSize,
|
|
|
kGBufferColorRenderTargetFormats[0], "CubeRefl GBuffer");
|
|
|
|
|
|
// Create color RT descriptions
|
|
|
for(U32 i = 0; i < kGBufferColorRenderTargetCount; ++i)
|
|
|
{
|
|
|
texinit.m_format = kGBufferColorRenderTargetFormats[i];
|
|
|
+ texinit.m_type = TextureType::kCube;
|
|
|
m_gbuffer.m_colorRtDescrs[i] = texinit;
|
|
|
m_gbuffer.m_colorRtDescrs[i].setName(RendererString().sprintf("CubeRefl GBuff Col #%u", i));
|
|
|
m_gbuffer.m_colorRtDescrs[i].bake();
|
|
|
@@ -81,27 +82,12 @@ Error ProbeReflections::initGBuffer()
|
|
|
|
|
|
// Create depth RT
|
|
|
texinit.m_format = getRenderer().getDepthNoStencilFormat();
|
|
|
+ texinit.m_type = TextureType::k2D;
|
|
|
texinit.setName("CubeRefl GBuff Depth");
|
|
|
m_gbuffer.m_depthRtDescr = texinit;
|
|
|
m_gbuffer.m_depthRtDescr.bake();
|
|
|
}
|
|
|
|
|
|
- // Create FB descr
|
|
|
- {
|
|
|
- m_gbuffer.m_fbDescr.m_colorAttachmentCount = kGBufferColorRenderTargetCount;
|
|
|
-
|
|
|
- for(U j = 0; j < kGBufferColorRenderTargetCount; ++j)
|
|
|
- {
|
|
|
- m_gbuffer.m_fbDescr.m_colorAttachments[j].m_loadOperation = AttachmentLoadOperation::kClear;
|
|
|
- }
|
|
|
-
|
|
|
- m_gbuffer.m_fbDescr.m_depthStencilAttachment.m_aspect = DepthStencilAspectBit::kDepth;
|
|
|
- m_gbuffer.m_fbDescr.m_depthStencilAttachment.m_loadOperation = AttachmentLoadOperation::kClear;
|
|
|
- m_gbuffer.m_fbDescr.m_depthStencilAttachment.m_clearValue.m_depthStencil.m_depth = 1.0f;
|
|
|
-
|
|
|
- m_gbuffer.m_fbDescr.bake();
|
|
|
- }
|
|
|
-
|
|
|
return Error::kNone;
|
|
|
}
|
|
|
|
|
|
@@ -110,17 +96,6 @@ Error ProbeReflections::initLightShading()
|
|
|
m_lightShading.m_tileSize = g_reflectionProbeResolutionCVar.get();
|
|
|
m_lightShading.m_mipCount = computeMaxMipmapCount2d(m_lightShading.m_tileSize, m_lightShading.m_tileSize, 8);
|
|
|
|
|
|
- for(U32 faceIdx = 0; faceIdx < 6; ++faceIdx)
|
|
|
- {
|
|
|
- // Light pass FB
|
|
|
- FramebufferDescription& fbDescr = m_lightShading.m_fbDescr[faceIdx];
|
|
|
- ANKI_ASSERT(!fbDescr.isBacked());
|
|
|
- fbDescr.m_colorAttachmentCount = 1;
|
|
|
- fbDescr.m_colorAttachments[0].m_surface.m_face = faceIdx;
|
|
|
- fbDescr.m_colorAttachments[0].m_loadOperation = AttachmentLoadOperation::kClear;
|
|
|
- fbDescr.bake();
|
|
|
- }
|
|
|
-
|
|
|
// Init deferred
|
|
|
ANKI_CHECK(m_lightShading.m_deferred.init());
|
|
|
|
|
|
@@ -133,12 +108,10 @@ Error ProbeReflections::initIrradiance()
|
|
|
|
|
|
// Create prog
|
|
|
{
|
|
|
- ANKI_CHECK(loadShaderProgram("ShaderBinaries/IrradianceDice.ankiprogbin",
|
|
|
- {{"WORKGROUP_SIZE_XY", MutatorValue(m_irradiance.m_workgroupSize)},
|
|
|
- {"LIGHT_SHADING_TEX", 1},
|
|
|
- {"STORE_LOCATION", 1},
|
|
|
- {"SECOND_BOUNCE", 0}},
|
|
|
- m_irradiance.m_prog, m_irradiance.m_grProg));
|
|
|
+ ANKI_CHECK(
|
|
|
+ loadShaderProgram("ShaderBinaries/IrradianceDice.ankiprogbin",
|
|
|
+ {{"THREDGROUP_SIZE_SQRT", MutatorValue(m_irradiance.m_workgroupSize)}, {"STORE_LOCATION", 1}, {"SECOND_BOUNCE", 0}},
|
|
|
+ m_irradiance.m_prog, m_irradiance.m_grProg));
|
|
|
}
|
|
|
|
|
|
// Create buff
|
|
|
@@ -166,7 +139,7 @@ Error ProbeReflections::initShadowMapping()
|
|
|
|
|
|
// RT descr
|
|
|
m_shadowMapping.m_rtDescr =
|
|
|
- getRenderer().create2DRenderTargetDescription(resolution * 6, resolution, getRenderer().getDepthNoStencilFormat(), "CubeRefl SM");
|
|
|
+ getRenderer().create2DRenderTargetDescription(resolution, resolution, getRenderer().getDepthNoStencilFormat(), "CubeRefl SM");
|
|
|
m_shadowMapping.m_rtDescr.bake();
|
|
|
|
|
|
// FB descr
|
|
|
@@ -179,136 +152,6 @@ Error ProbeReflections::initShadowMapping()
|
|
|
return Error::kNone;
|
|
|
}
|
|
|
|
|
|
-void ProbeReflections::runGBuffer(const Array<GpuVisibilityOutput, 6>& visOuts, const Array<Mat4, 6>& viewProjMatx, const Array<Mat3x4, 6> viewMats,
|
|
|
- RenderPassWorkContext& rgraphCtx)
|
|
|
-{
|
|
|
- ANKI_TRACE_SCOPED_EVENT(ProbeReflections);
|
|
|
- CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
|
|
|
-
|
|
|
- const U32 faceIdx = rgraphCtx.m_currentSecondLevelCommandBufferIndex;
|
|
|
-
|
|
|
- const U32 viewportX = faceIdx * m_gbuffer.m_tileSize;
|
|
|
- cmdb.setViewport(viewportX, 0, m_gbuffer.m_tileSize, m_gbuffer.m_tileSize);
|
|
|
- cmdb.setScissor(viewportX, 0, m_gbuffer.m_tileSize, m_gbuffer.m_tileSize);
|
|
|
-
|
|
|
- RenderableDrawerArguments args;
|
|
|
- args.m_viewMatrix = viewMats[faceIdx];
|
|
|
- args.m_cameraTransform = viewMats[faceIdx].getInverseTransformation();
|
|
|
- args.m_viewProjectionMatrix = viewProjMatx[faceIdx];
|
|
|
- args.m_previousViewProjectionMatrix = Mat4::getIdentity(); // Don't care about prev mats
|
|
|
- args.m_sampler = getRenderer().getSamplers().m_trilinearRepeat.get();
|
|
|
- args.m_renderingTechinuqe = RenderingTechnique::kGBuffer;
|
|
|
- args.m_viewport = UVec4(viewportX, 0, m_gbuffer.m_tileSize, m_gbuffer.m_tileSize);
|
|
|
- args.fillMdi(visOuts[faceIdx]);
|
|
|
-
|
|
|
- getRenderer().getSceneDrawer().drawMdi(args, cmdb);
|
|
|
-}
|
|
|
-
|
|
|
-void ProbeReflections::runLightShading(U32 faceIdx, const BufferOffsetRange& visResult, const Mat4& viewProjMat, const Mat4& cascadeViewProjMat,
|
|
|
- const ReflectionProbeComponent& probe, RenderPassWorkContext& rgraphCtx)
|
|
|
-{
|
|
|
- ANKI_ASSERT(faceIdx <= 6);
|
|
|
- ANKI_TRACE_SCOPED_EVENT(ProbeReflections);
|
|
|
-
|
|
|
- TraditionalDeferredLightShadingDrawInfo dsInfo;
|
|
|
- dsInfo.m_viewProjectionMatrix = viewProjMat;
|
|
|
- dsInfo.m_invViewProjectionMatrix = viewProjMat.getInverse();
|
|
|
- dsInfo.m_cameraPosWSpace = probe.getWorldPosition().xyz1();
|
|
|
- dsInfo.m_viewport = UVec4(0, 0, m_lightShading.m_tileSize, m_lightShading.m_tileSize);
|
|
|
- dsInfo.m_gbufferTexCoordsScale = Vec2(1.0f / F32(m_lightShading.m_tileSize * 6), 1.0f / F32(m_lightShading.m_tileSize));
|
|
|
- dsInfo.m_gbufferTexCoordsBias = Vec2(F32(faceIdx) * (1.0f / 6.0f), 0.0f);
|
|
|
- dsInfo.m_lightbufferTexCoordsScale = Vec2(1.0f / F32(m_lightShading.m_tileSize), 1.0f / F32(m_lightShading.m_tileSize));
|
|
|
- dsInfo.m_lightbufferTexCoordsBias = Vec2(0.0f, 0.0f);
|
|
|
- dsInfo.m_effectiveShadowDistance = probe.getShadowsRenderRadius();
|
|
|
-
|
|
|
- const F32 xScale = 1.0f / 6.0f;
|
|
|
- const F32 yScale = 1.0f;
|
|
|
- const F32 xOffset = F32(faceIdx) * (1.0f / 6.0f);
|
|
|
- const F32 yOffset = 0.0f;
|
|
|
- const Mat4 atlasMtx(xScale, 0.0f, 0.0f, xOffset, 0.0f, yScale, 0.0f, yOffset, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f);
|
|
|
- const Mat4 biasMat4(0.5f, 0.0f, 0.0f, 0.5f, 0.0f, 0.5f, 0.0f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f);
|
|
|
- dsInfo.m_dirLightMatrix = atlasMtx * biasMat4 * cascadeViewProjMat;
|
|
|
-
|
|
|
- dsInfo.m_visibleLightsBuffer = visResult;
|
|
|
- dsInfo.m_gbufferRenderTargets[0] = m_ctx.m_gbufferColorRts[0];
|
|
|
- dsInfo.m_gbufferRenderTargets[1] = m_ctx.m_gbufferColorRts[1];
|
|
|
- dsInfo.m_gbufferRenderTargets[2] = m_ctx.m_gbufferColorRts[2];
|
|
|
- dsInfo.m_gbufferDepthRenderTarget = m_ctx.m_gbufferDepthRt;
|
|
|
- if(m_ctx.m_shadowMapRt.isValid())
|
|
|
- {
|
|
|
- dsInfo.m_directionalLightShadowmapRenderTarget = m_ctx.m_shadowMapRt;
|
|
|
- }
|
|
|
- dsInfo.m_renderpassContext = &rgraphCtx;
|
|
|
-
|
|
|
- m_lightShading.m_deferred.drawLights(dsInfo);
|
|
|
-}
|
|
|
-
|
|
|
-void ProbeReflections::runMipmappingOfLightShading(U32 faceIdx, RenderPassWorkContext& rgraphCtx)
|
|
|
-{
|
|
|
- ANKI_ASSERT(faceIdx < 6);
|
|
|
-
|
|
|
- ANKI_TRACE_SCOPED_EVENT(ProbeReflections);
|
|
|
-
|
|
|
- TextureSubresourceInfo subresource(TextureSurfaceInfo(0, 0, faceIdx, 0));
|
|
|
- subresource.m_mipmapCount = m_lightShading.m_mipCount;
|
|
|
-
|
|
|
- Texture* texToBind;
|
|
|
- rgraphCtx.getRenderTargetState(m_ctx.m_lightShadingRt, subresource, texToBind);
|
|
|
-
|
|
|
- TextureViewInitInfo viewInit(texToBind, subresource);
|
|
|
- TextureViewPtr view = GrManager::getSingleton().newTextureView(viewInit);
|
|
|
- rgraphCtx.m_commandBuffer->generateMipmaps2d(view.get());
|
|
|
-}
|
|
|
-
|
|
|
-void ProbeReflections::runIrradiance(RenderPassWorkContext& rgraphCtx)
|
|
|
-{
|
|
|
- ANKI_TRACE_SCOPED_EVENT(ProbeReflections);
|
|
|
-
|
|
|
- CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
|
|
|
-
|
|
|
- cmdb.bindShaderProgram(m_irradiance.m_grProg.get());
|
|
|
-
|
|
|
- // Bind stuff
|
|
|
- cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_nearestNearestClamp.get());
|
|
|
-
|
|
|
- TextureSubresourceInfo subresource;
|
|
|
- subresource.m_faceCount = 6;
|
|
|
- rgraphCtx.bindTexture(0, 1, m_ctx.m_lightShadingRt, subresource);
|
|
|
-
|
|
|
- cmdb.bindUavBuffer(0, 3, m_irradiance.m_diceValuesBuff.get(), 0, m_irradiance.m_diceValuesBuff->getSize());
|
|
|
-
|
|
|
- // Draw
|
|
|
- cmdb.dispatchCompute(1, 1, 1);
|
|
|
-}
|
|
|
-
|
|
|
-void ProbeReflections::runIrradianceToRefl(RenderPassWorkContext& rgraphCtx)
|
|
|
-{
|
|
|
- ANKI_TRACE_SCOPED_EVENT(ProbeReflections);
|
|
|
-
|
|
|
- CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
|
|
|
-
|
|
|
- cmdb.bindShaderProgram(m_irradianceToRefl.m_grProg.get());
|
|
|
-
|
|
|
- // Bind resources
|
|
|
- cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_nearestNearestClamp.get());
|
|
|
-
|
|
|
- rgraphCtx.bindColorTexture(0, 1, m_ctx.m_gbufferColorRts[0], 0);
|
|
|
- rgraphCtx.bindColorTexture(0, 1, m_ctx.m_gbufferColorRts[1], 1);
|
|
|
- rgraphCtx.bindColorTexture(0, 1, m_ctx.m_gbufferColorRts[2], 2);
|
|
|
-
|
|
|
- cmdb.bindUavBuffer(0, 2, m_irradiance.m_diceValuesBuff.get(), 0, m_irradiance.m_diceValuesBuff->getSize());
|
|
|
-
|
|
|
- for(U8 f = 0; f < 6; ++f)
|
|
|
- {
|
|
|
- TextureSubresourceInfo subresource;
|
|
|
- subresource.m_faceCount = 1;
|
|
|
- subresource.m_firstFace = f;
|
|
|
- rgraphCtx.bindUavTexture(0, 3, m_ctx.m_lightShadingRt, subresource, f);
|
|
|
- }
|
|
|
-
|
|
|
- dispatchPPCompute(cmdb, 8, 8, m_lightShading.m_tileSize, m_lightShading.m_tileSize);
|
|
|
-}
|
|
|
-
|
|
|
void ProbeReflections::populateRenderGraph(RenderingContext& rctx)
|
|
|
{
|
|
|
ANKI_TRACE_SCOPED_EVENT(ProbeReflections);
|
|
|
@@ -329,274 +172,326 @@ void ProbeReflections::populateRenderGraph(RenderingContext& rctx)
|
|
|
if(probeToRefresh == nullptr || ResourceManager::getSingleton().getAsyncLoader().getTasksInFlightCount() != 0) [[likely]]
|
|
|
{
|
|
|
// Nothing to update or can't update right now, early exit
|
|
|
- m_ctx.m_lightShadingRt = {};
|
|
|
+ m_runCtx = {};
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
g_probeReflectionCountStatVar.increment(1);
|
|
|
probeToRefresh->setEnvironmentTextureAsRefreshed();
|
|
|
|
|
|
-#if ANKI_EXTRA_CHECKS
|
|
|
- m_ctx = {};
|
|
|
-#endif
|
|
|
-
|
|
|
RenderGraphDescription& rgraph = rctx.m_renderGraphDescr;
|
|
|
|
|
|
- // GBuffer visibility
|
|
|
- Array<GpuVisibilityOutput, 6> visOuts;
|
|
|
- Array<Frustum, 6> frustums;
|
|
|
- for(U32 i = 0; i < 6; ++i)
|
|
|
+ // Create render targets now to save memory
|
|
|
+ RenderTargetHandle probeTexture = rgraph.importRenderTarget(&probeToRefresh->getReflectionTexture(), TextureUsageBit::kNone);
|
|
|
+ m_runCtx.m_probeTex = probeTexture;
|
|
|
+ BufferHandle irradianceDiceValuesBuffHandle = rgraph.importBuffer(m_irradiance.m_diceValuesBuff.get(), BufferUsageBit::kNone);
|
|
|
+ RenderTargetHandle gbufferDepthRt = rgraph.newRenderTarget(m_gbuffer.m_depthRtDescr);
|
|
|
+ RenderTargetHandle shadowMapRt = rgraph.newRenderTarget(m_shadowMapping.m_rtDescr);
|
|
|
+
|
|
|
+ Array<RenderTargetHandle, kGBufferColorRenderTargetCount> gbufferColorRts;
|
|
|
+ for(U i = 0; i < kGBufferColorRenderTargetCount; ++i)
|
|
|
{
|
|
|
- Frustum& frustum = frustums[i];
|
|
|
- frustum.setPerspective(kClusterObjectFrustumNearPlane, probeToRefresh->getRenderRadius(), kPi / 2.0f, kPi / 2.0f);
|
|
|
- frustum.setWorldTransform(Transform(probeToRefresh->getWorldPosition().xyz0(), Frustum::getOmnidirectionalFrustumRotations()[i], 1.0f));
|
|
|
- frustum.update();
|
|
|
-
|
|
|
- Array<F32, kMaxLodCount - 1> lodDistances = {g_lod0MaxDistanceCVar.get(), g_lod1MaxDistanceCVar.get()};
|
|
|
-
|
|
|
- FrustumGpuVisibilityInput visIn;
|
|
|
- visIn.m_passesName = "Cube refl GBuffer";
|
|
|
- visIn.m_technique = RenderingTechnique::kGBuffer;
|
|
|
- visIn.m_viewProjectionMatrix = frustum.getViewProjectionMatrix();
|
|
|
- visIn.m_lodReferencePoint = probeToRefresh->getWorldPosition();
|
|
|
- visIn.m_lodDistances = lodDistances;
|
|
|
- visIn.m_rgraph = &rgraph;
|
|
|
- visIn.m_finalRenderTargetSize = UVec2(m_gbuffer.m_tileSize);
|
|
|
-
|
|
|
- getRenderer().getGpuVisibility().populateRenderGraph(visIn, visOuts[i]);
|
|
|
+ gbufferColorRts[i] = rgraph.newRenderTarget(m_gbuffer.m_colorRtDescrs[i]);
|
|
|
}
|
|
|
|
|
|
- // GBuffer pass
|
|
|
+ for(U8 f = 0; f < 6; ++f)
|
|
|
{
|
|
|
- // RTs
|
|
|
- Array<RenderTargetHandle, kMaxColorRenderTargets> rts;
|
|
|
- for(U i = 0; i < kGBufferColorRenderTargetCount; ++i)
|
|
|
+ // GBuffer visibility
|
|
|
+ GpuVisibilityOutput visOut;
|
|
|
+ Frustum frustum;
|
|
|
{
|
|
|
- m_ctx.m_gbufferColorRts[i] = rgraph.newRenderTarget(m_gbuffer.m_colorRtDescrs[i]);
|
|
|
- rts[i] = m_ctx.m_gbufferColorRts[i];
|
|
|
+ frustum.setPerspective(kClusterObjectFrustumNearPlane, probeToRefresh->getRenderRadius(), kPi / 2.0f, kPi / 2.0f);
|
|
|
+ frustum.setWorldTransform(Transform(probeToRefresh->getWorldPosition().xyz0(), Frustum::getOmnidirectionalFrustumRotations()[f], 1.0f));
|
|
|
+ frustum.update();
|
|
|
+
|
|
|
+ Array<F32, kMaxLodCount - 1> lodDistances = {g_lod0MaxDistanceCVar.get(), g_lod1MaxDistanceCVar.get()};
|
|
|
+
|
|
|
+ FrustumGpuVisibilityInput visIn;
|
|
|
+ visIn.m_passesName = computeTempPassName("Cube refl: GBuffer", f);
|
|
|
+ visIn.m_technique = RenderingTechnique::kGBuffer;
|
|
|
+ visIn.m_viewProjectionMatrix = frustum.getViewProjectionMatrix();
|
|
|
+ visIn.m_lodReferencePoint = probeToRefresh->getWorldPosition();
|
|
|
+ visIn.m_lodDistances = lodDistances;
|
|
|
+ visIn.m_rgraph = &rgraph;
|
|
|
+ visIn.m_finalRenderTargetSize = UVec2(m_gbuffer.m_tileSize);
|
|
|
+
|
|
|
+ getRenderer().getGpuVisibility().populateRenderGraph(visIn, visOut);
|
|
|
}
|
|
|
- m_ctx.m_gbufferDepthRt = rgraph.newRenderTarget(m_gbuffer.m_depthRtDescr);
|
|
|
|
|
|
- // Prepare the matrices
|
|
|
- Array<Mat4, 6> viewProjMats;
|
|
|
- Array<Mat3x4, 6> viewMats;
|
|
|
- for(U32 f = 0; f < 6; ++f)
|
|
|
+ // GBuffer pass
|
|
|
{
|
|
|
- viewProjMats[f] = frustums[f].getViewProjectionMatrix();
|
|
|
- viewMats[f] = frustums[f].getViewMatrix();
|
|
|
- }
|
|
|
+ // Create the FB descr
|
|
|
+ FramebufferDescription fbDescr;
|
|
|
+ fbDescr.m_colorAttachmentCount = kGBufferColorRenderTargetCount;
|
|
|
+ for(U j = 0; j < kGBufferColorRenderTargetCount; ++j)
|
|
|
+ {
|
|
|
+ fbDescr.m_colorAttachments[j].m_loadOperation = AttachmentLoadOperation::kClear;
|
|
|
+ fbDescr.m_colorAttachments[j].m_surface.m_face = f;
|
|
|
+ }
|
|
|
+ fbDescr.m_depthStencilAttachment.m_aspect = DepthStencilAspectBit::kDepth;
|
|
|
+ fbDescr.m_depthStencilAttachment.m_loadOperation = AttachmentLoadOperation::kClear;
|
|
|
+ fbDescr.m_depthStencilAttachment.m_clearValue.m_depthStencil.m_depth = 1.0f;
|
|
|
+ fbDescr.bake();
|
|
|
|
|
|
- // Pass
|
|
|
- GraphicsRenderPassDescription& pass = rgraph.newGraphicsRenderPass("Cube refl GBuffer");
|
|
|
- pass.setFramebufferInfo(m_gbuffer.m_fbDescr, rts, m_ctx.m_gbufferDepthRt);
|
|
|
- pass.setWork(6, [this, visOuts, viewProjMats, viewMats](RenderPassWorkContext& rgraphCtx) {
|
|
|
- runGBuffer(visOuts, viewProjMats, viewMats, rgraphCtx);
|
|
|
- });
|
|
|
+ // Create pass
|
|
|
+ GraphicsRenderPassDescription& pass = rgraph.newGraphicsRenderPass(computeTempPassName("Cube refl: GBuffer", f));
|
|
|
+ pass.setFramebufferInfo(fbDescr, gbufferColorRts, gbufferDepthRt);
|
|
|
|
|
|
- for(U i = 0; i < kGBufferColorRenderTargetCount; ++i)
|
|
|
- {
|
|
|
- pass.newTextureDependency(m_ctx.m_gbufferColorRts[i], TextureUsageBit::kFramebufferWrite);
|
|
|
- }
|
|
|
+ for(U i = 0; i < kGBufferColorRenderTargetCount; ++i)
|
|
|
+ {
|
|
|
+ pass.newTextureDependency(gbufferColorRts[i], TextureUsageBit::kFramebufferWrite, TextureSurfaceInfo(0, 0, f, 0));
|
|
|
+ }
|
|
|
|
|
|
- TextureSubresourceInfo subresource(DepthStencilAspectBit::kDepth);
|
|
|
- pass.newTextureDependency(m_ctx.m_gbufferDepthRt, TextureUsageBit::kAllFramebuffer, subresource);
|
|
|
+ pass.newTextureDependency(gbufferDepthRt, TextureUsageBit::kAllFramebuffer, TextureSubresourceInfo(DepthStencilAspectBit::kDepth));
|
|
|
+ pass.newBufferDependency(visOut.m_someBufferHandle, BufferUsageBit::kIndirectDraw);
|
|
|
|
|
|
- for(U32 i = 0; i < 6; ++i)
|
|
|
- {
|
|
|
- pass.newBufferDependency(visOuts[i].m_someBufferHandle, BufferUsageBit::kIndirectDraw);
|
|
|
+ pass.setWork(1, [this, visOut, viewProjMat = frustum.getViewProjectionMatrix(),
|
|
|
+ viewMat = frustum.getViewMatrix()](RenderPassWorkContext& rgraphCtx) {
|
|
|
+ ANKI_TRACE_SCOPED_EVENT(ProbeReflections);
|
|
|
+ CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
|
|
|
+
|
|
|
+ cmdb.setViewport(0, 0, m_gbuffer.m_tileSize, m_gbuffer.m_tileSize);
|
|
|
+
|
|
|
+ RenderableDrawerArguments args;
|
|
|
+ args.m_viewMatrix = viewMat;
|
|
|
+ args.m_cameraTransform = viewMat.getInverseTransformation();
|
|
|
+ args.m_viewProjectionMatrix = viewProjMat;
|
|
|
+ args.m_previousViewProjectionMatrix = Mat4::getIdentity(); // Don't care about prev mats
|
|
|
+ args.m_sampler = getRenderer().getSamplers().m_trilinearRepeat.get();
|
|
|
+ args.m_renderingTechinuqe = RenderingTechnique::kGBuffer;
|
|
|
+ args.m_viewport = UVec4(0, 0, m_gbuffer.m_tileSize, m_gbuffer.m_tileSize);
|
|
|
+ args.fillMdi(visOut);
|
|
|
+
|
|
|
+ getRenderer().getSceneDrawer().drawMdi(args, cmdb);
|
|
|
+ });
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- // Shadow visibility. Optional
|
|
|
- const LightComponent* dirLightc = SceneGraph::getSingleton().getDirectionalLight();
|
|
|
- const Bool doShadows = dirLightc && dirLightc->getShadowEnabled();
|
|
|
- Array<GpuVisibilityOutput, 6> shadowVisOuts;
|
|
|
- Array<Mat4, 6> cascadeViewProjMats;
|
|
|
- Array<Mat3x4, 6> cascadeViewMats;
|
|
|
- Array<Mat4, 6> cascadeProjMats;
|
|
|
- if(doShadows)
|
|
|
- {
|
|
|
- for(U i = 0; i < 6; ++i)
|
|
|
+ // Shadow visibility. Optional
|
|
|
+ const LightComponent* dirLightc = SceneGraph::getSingleton().getDirectionalLight();
|
|
|
+ const Bool doShadows = dirLightc && dirLightc->getShadowEnabled();
|
|
|
+ GpuVisibilityOutput shadowVisOut;
|
|
|
+ Mat4 cascadeViewProjMat;
|
|
|
+ Mat3x4 cascadeViewMat;
|
|
|
+ Mat4 cascadeProjMat;
|
|
|
+ if(doShadows)
|
|
|
{
|
|
|
constexpr U32 kCascadeCount = 1;
|
|
|
- dirLightc->computeCascadeFrustums(frustums[i], Array<F32, kCascadeCount>{probeToRefresh->getShadowsRenderRadius()},
|
|
|
- WeakArray<Mat4>(&cascadeProjMats[i], kCascadeCount),
|
|
|
- WeakArray<Mat3x4>(&cascadeViewMats[i], kCascadeCount));
|
|
|
+ dirLightc->computeCascadeFrustums(frustum, Array<F32, kCascadeCount>{probeToRefresh->getShadowsRenderRadius()},
|
|
|
+ WeakArray<Mat4>(&cascadeProjMat, kCascadeCount), WeakArray<Mat3x4>(&cascadeViewMat, kCascadeCount));
|
|
|
|
|
|
- cascadeViewProjMats[i] = cascadeProjMats[i] * Mat4(cascadeViewMats[i], Vec4(0.0f, 0.0f, 0.0f, 1.0f));
|
|
|
+ cascadeViewProjMat = cascadeProjMat * Mat4(cascadeViewMat, Vec4(0.0f, 0.0f, 0.0f, 1.0f));
|
|
|
|
|
|
Array<F32, kMaxLodCount - 1> lodDistances = {g_lod0MaxDistanceCVar.get(), g_lod1MaxDistanceCVar.get()};
|
|
|
|
|
|
FrustumGpuVisibilityInput visIn;
|
|
|
- visIn.m_passesName = "Cube refl shadows";
|
|
|
+ visIn.m_passesName = computeTempPassName("Cube refl: Shadows", f);
|
|
|
visIn.m_technique = RenderingTechnique::kDepth;
|
|
|
- visIn.m_viewProjectionMatrix = cascadeViewProjMats[i];
|
|
|
+ visIn.m_viewProjectionMatrix = cascadeViewProjMat;
|
|
|
visIn.m_lodReferencePoint = probeToRefresh->getWorldPosition();
|
|
|
visIn.m_lodDistances = lodDistances;
|
|
|
visIn.m_rgraph = &rgraph;
|
|
|
visIn.m_finalRenderTargetSize = UVec2(m_shadowMapping.m_rtDescr.m_height);
|
|
|
|
|
|
- getRenderer().getGpuVisibility().populateRenderGraph(visIn, shadowVisOuts[i]);
|
|
|
+ getRenderer().getGpuVisibility().populateRenderGraph(visIn, shadowVisOut);
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- // Shadows. Optional
|
|
|
- if(doShadows)
|
|
|
- {
|
|
|
- // RT
|
|
|
- m_ctx.m_shadowMapRt = rgraph.newRenderTarget(m_shadowMapping.m_rtDescr);
|
|
|
-
|
|
|
- // Pass
|
|
|
- GraphicsRenderPassDescription& pass = rgraph.newGraphicsRenderPass("Cube refl shadows");
|
|
|
- pass.setFramebufferInfo(m_shadowMapping.m_fbDescr, {}, m_ctx.m_shadowMapRt);
|
|
|
- pass.setWork(6, [this, shadowVisOuts, cascadeViewProjMats, cascadeViewMats](RenderPassWorkContext& rgraphCtx) {
|
|
|
- runShadowMapping(shadowVisOuts, cascadeViewProjMats, cascadeViewMats, rgraphCtx);
|
|
|
- });
|
|
|
+ // Shadows. Optional
|
|
|
+ if(doShadows)
|
|
|
+ {
|
|
|
+ // Pass
|
|
|
+ GraphicsRenderPassDescription& pass = rgraph.newGraphicsRenderPass(computeTempPassName("Cube refl: Shadows", f));
|
|
|
+ pass.setFramebufferInfo(m_shadowMapping.m_fbDescr, {}, shadowMapRt);
|
|
|
|
|
|
- TextureSubresourceInfo subresource(DepthStencilAspectBit::kDepth);
|
|
|
- pass.newTextureDependency(m_ctx.m_shadowMapRt, TextureUsageBit::kAllFramebuffer, subresource);
|
|
|
+ pass.newTextureDependency(shadowMapRt, TextureUsageBit::kAllFramebuffer, TextureSubresourceInfo(DepthStencilAspectBit::kDepth));
|
|
|
+ pass.newBufferDependency(shadowVisOut.m_someBufferHandle, BufferUsageBit::kIndirectDraw);
|
|
|
|
|
|
- for(U32 i = 0; i < 6; ++i)
|
|
|
- {
|
|
|
- pass.newBufferDependency(shadowVisOuts[i].m_someBufferHandle, BufferUsageBit::kIndirectDraw);
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- m_ctx.m_shadowMapRt = {};
|
|
|
- }
|
|
|
+ pass.setWork(1, [this, shadowVisOut, cascadeViewProjMat, cascadeViewMat](RenderPassWorkContext& rgraphCtx) {
|
|
|
+ ANKI_TRACE_SCOPED_EVENT(ProbeReflections);
|
|
|
|
|
|
- // Light visibility
|
|
|
- Array<GpuVisibilityNonRenderablesOutput, 6> lightVis;
|
|
|
- for(U32 faceIdx = 0; faceIdx < 6; ++faceIdx)
|
|
|
- {
|
|
|
- GpuVisibilityNonRenderablesInput in;
|
|
|
- in.m_passesName = "Cube refl light visibility";
|
|
|
- in.m_objectType = GpuSceneNonRenderableObjectType::kLight;
|
|
|
- in.m_viewProjectionMat = frustums[faceIdx].getViewProjectionMatrix();
|
|
|
- in.m_rgraph = &rgraph;
|
|
|
- getRenderer().getGpuVisibilityNonRenderables().populateRenderGraph(in, lightVis[faceIdx]);
|
|
|
- }
|
|
|
+ CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
|
|
|
+ cmdb.setPolygonOffset(kShadowsPolygonOffsetFactor, kShadowsPolygonOffsetUnits);
|
|
|
|
|
|
- // Light shading passes
|
|
|
- {
|
|
|
- // RT
|
|
|
- m_ctx.m_lightShadingRt = rgraph.importRenderTarget(&probeToRefresh->getReflectionTexture(), TextureUsageBit::kNone);
|
|
|
+ const U32 rez = m_shadowMapping.m_rtDescr.m_height;
|
|
|
+ cmdb.setViewport(0, 0, rez, rez);
|
|
|
|
|
|
- // Passes
|
|
|
- static constexpr Array<CString, 6> passNames = {"Cube refl light shading #0", "Cube refl light shading #1", "Cube refl light shading #2",
|
|
|
- "Cube refl light shading #3", "Cube refl light shading #4", "Cube refl light shading #5"};
|
|
|
- for(U32 faceIdx = 0; faceIdx < 6; ++faceIdx)
|
|
|
- {
|
|
|
- GraphicsRenderPassDescription& pass = rgraph.newGraphicsRenderPass(passNames[faceIdx]);
|
|
|
+ RenderableDrawerArguments args;
|
|
|
+ args.m_viewMatrix = cascadeViewMat;
|
|
|
+ args.m_cameraTransform = cascadeViewMat.getInverseTransformation();
|
|
|
+ args.m_viewProjectionMatrix = cascadeViewProjMat;
|
|
|
+ args.m_previousViewProjectionMatrix = Mat4::getIdentity(); // Don't care
|
|
|
+ args.m_sampler = getRenderer().getSamplers().m_trilinearRepeatAniso.get();
|
|
|
+ args.m_renderingTechinuqe = RenderingTechnique::kDepth;
|
|
|
+ args.m_viewport = UVec4(0, 0, rez, rez);
|
|
|
+ args.fillMdi(shadowVisOut);
|
|
|
|
|
|
- pass.setFramebufferInfo(m_lightShading.m_fbDescr[faceIdx], {m_ctx.m_lightShadingRt});
|
|
|
- pass.setWork([this, visResult = lightVis[faceIdx].m_visiblesBuffer, faceIdx, viewProjMat = frustums[faceIdx].getViewProjectionMatrix(),
|
|
|
- cascadeViewProjMat = cascadeViewProjMats[faceIdx], probeToRefresh](RenderPassWorkContext& rgraphCtx) {
|
|
|
- runLightShading(faceIdx, visResult, viewProjMat, cascadeViewProjMat, *probeToRefresh, rgraphCtx);
|
|
|
+ getRenderer().getSceneDrawer().drawMdi(args, cmdb);
|
|
|
});
|
|
|
+ }
|
|
|
|
|
|
- pass.newBufferDependency(lightVis[faceIdx].m_visiblesBufferHandle, BufferUsageBit::kUavFragmentRead);
|
|
|
+ // Light visibility
|
|
|
+ GpuVisibilityNonRenderablesOutput lightVis;
|
|
|
+ {
|
|
|
+ GpuVisibilityNonRenderablesInput in;
|
|
|
+ in.m_passesName = computeTempPassName("Cube refl: Light visibility", f);
|
|
|
+ in.m_objectType = GpuSceneNonRenderableObjectType::kLight;
|
|
|
+ in.m_viewProjectionMat = frustum.getViewProjectionMatrix();
|
|
|
+ in.m_rgraph = &rgraph;
|
|
|
+ getRenderer().getGpuVisibilityNonRenderables().populateRenderGraph(in, lightVis);
|
|
|
+ }
|
|
|
|
|
|
- TextureSubresourceInfo subresource(TextureSurfaceInfo(0, 0, faceIdx, 0));
|
|
|
- pass.newTextureDependency(m_ctx.m_lightShadingRt, TextureUsageBit::kFramebufferWrite, subresource);
|
|
|
+ // Light shading pass
|
|
|
+ {
|
|
|
+ // FB descr
|
|
|
+ FramebufferDescription fbDescr;
|
|
|
+ fbDescr.m_colorAttachmentCount = 1;
|
|
|
+ fbDescr.m_colorAttachments[0].m_surface.m_face = f;
|
|
|
+ fbDescr.m_colorAttachments[0].m_loadOperation = AttachmentLoadOperation::kClear;
|
|
|
+ fbDescr.bake();
|
|
|
+
|
|
|
+ // Pass
|
|
|
+ GraphicsRenderPassDescription& pass = rgraph.newGraphicsRenderPass(computeTempPassName("Cube refl: light shading", f));
|
|
|
+ pass.setFramebufferInfo(fbDescr, {probeTexture});
|
|
|
+
|
|
|
+ pass.newBufferDependency(lightVis.m_visiblesBufferHandle, BufferUsageBit::kUavFragmentRead);
|
|
|
+ pass.newTextureDependency(probeTexture, TextureUsageBit::kFramebufferWrite, TextureSubresourceInfo(TextureSurfaceInfo(0, 0, f, 0)));
|
|
|
|
|
|
for(U i = 0; i < kGBufferColorRenderTargetCount; ++i)
|
|
|
{
|
|
|
- pass.newTextureDependency(m_ctx.m_gbufferColorRts[i], TextureUsageBit::kSampledFragment);
|
|
|
+ pass.newTextureDependency(gbufferColorRts[i], TextureUsageBit::kSampledFragment, TextureSurfaceInfo(0, 0, f, 0));
|
|
|
}
|
|
|
- pass.newTextureDependency(m_ctx.m_gbufferDepthRt, TextureUsageBit::kSampledFragment,
|
|
|
- TextureSubresourceInfo(DepthStencilAspectBit::kDepth));
|
|
|
+ pass.newTextureDependency(gbufferDepthRt, TextureUsageBit::kSampledFragment, TextureSubresourceInfo(DepthStencilAspectBit::kDepth));
|
|
|
|
|
|
- if(m_ctx.m_shadowMapRt.isValid())
|
|
|
+ if(shadowMapRt.isValid())
|
|
|
{
|
|
|
- pass.newTextureDependency(m_ctx.m_shadowMapRt, TextureUsageBit::kSampledFragment);
|
|
|
+ pass.newTextureDependency(shadowMapRt, TextureUsageBit::kSampledFragment);
|
|
|
}
|
|
|
+
|
|
|
+ pass.setWork([this, visResult = lightVis.m_visiblesBuffer, viewProjMat = frustum.getViewProjectionMatrix(),
|
|
|
+ cascadeViewProjMat = cascadeViewProjMat, probeToRefresh, gbufferColorRts, gbufferDepthRt, shadowMapRt,
|
|
|
+ faceIdx = f](RenderPassWorkContext& rgraphCtx) {
|
|
|
+ ANKI_TRACE_SCOPED_EVENT(ProbeReflections);
|
|
|
+
|
|
|
+ TraditionalDeferredLightShadingDrawInfo dsInfo;
|
|
|
+ dsInfo.m_viewProjectionMatrix = viewProjMat;
|
|
|
+ dsInfo.m_invViewProjectionMatrix = viewProjMat.getInverse();
|
|
|
+ dsInfo.m_cameraPosWSpace = probeToRefresh->getWorldPosition().xyz1();
|
|
|
+ dsInfo.m_viewport = UVec4(0, 0, m_lightShading.m_tileSize, m_lightShading.m_tileSize);
|
|
|
+ dsInfo.m_effectiveShadowDistance = probeToRefresh->getShadowsRenderRadius();
|
|
|
+
|
|
|
+ const Mat4 biasMat4(0.5f, 0.0f, 0.0f, 0.5f, 0.0f, 0.5f, 0.0f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f);
|
|
|
+ dsInfo.m_dirLightMatrix = biasMat4 * cascadeViewProjMat;
|
|
|
+
|
|
|
+ dsInfo.m_visibleLightsBuffer = visResult;
|
|
|
+ dsInfo.m_gbufferRenderTargets[0] = gbufferColorRts[0];
|
|
|
+ dsInfo.m_gbufferRenderTargetSubresourceInfos[0].m_firstFace = faceIdx;
|
|
|
+ dsInfo.m_gbufferRenderTargets[1] = gbufferColorRts[1];
|
|
|
+ dsInfo.m_gbufferRenderTargetSubresourceInfos[1].m_firstFace = faceIdx;
|
|
|
+ dsInfo.m_gbufferRenderTargets[2] = gbufferColorRts[2];
|
|
|
+ dsInfo.m_gbufferRenderTargetSubresourceInfos[2].m_firstFace = faceIdx;
|
|
|
+ dsInfo.m_gbufferDepthRenderTarget = gbufferDepthRt;
|
|
|
+ if(shadowMapRt.isValid())
|
|
|
+ {
|
|
|
+ dsInfo.m_directionalLightShadowmapRenderTarget = shadowMapRt;
|
|
|
+ }
|
|
|
+ dsInfo.m_renderpassContext = &rgraphCtx;
|
|
|
+
|
|
|
+ m_lightShading.m_deferred.drawLights(dsInfo);
|
|
|
+ });
|
|
|
}
|
|
|
- }
|
|
|
+ } // For 6 faces
|
|
|
|
|
|
- // Irradiance passes
|
|
|
+ // Compute Irradiance
|
|
|
{
|
|
|
- m_ctx.m_irradianceDiceValuesBuffHandle = rgraph.importBuffer(m_irradiance.m_diceValuesBuff.get(), BufferUsageBit::kNone);
|
|
|
+ ComputeRenderPassDescription& pass = rgraph.newComputeRenderPass("Cube refl: Irradiance");
|
|
|
|
|
|
- ComputeRenderPassDescription& pass = rgraph.newComputeRenderPass("Cube refl irradiance");
|
|
|
+ pass.newTextureDependency(probeTexture, TextureUsageBit::kSampledCompute);
|
|
|
|
|
|
- pass.setWork([this](RenderPassWorkContext& rgraphCtx) {
|
|
|
- runIrradiance(rgraphCtx);
|
|
|
- });
|
|
|
+ pass.newBufferDependency(irradianceDiceValuesBuffHandle, BufferUsageBit::kUavComputeWrite);
|
|
|
|
|
|
- // Read a cube but only one layer and level
|
|
|
- TextureSubresourceInfo readSubresource;
|
|
|
- readSubresource.m_faceCount = 6;
|
|
|
- pass.newTextureDependency(m_ctx.m_lightShadingRt, TextureUsageBit::kSampledCompute, readSubresource);
|
|
|
+ pass.setWork([this, probeTexture](RenderPassWorkContext& rgraphCtx) {
|
|
|
+ ANKI_TRACE_SCOPED_EVENT(ProbeReflections);
|
|
|
|
|
|
- pass.newBufferDependency(m_ctx.m_irradianceDiceValuesBuffHandle, BufferUsageBit::kUavComputeWrite);
|
|
|
- }
|
|
|
+ CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
|
|
|
|
|
|
- // Write irradiance back to refl
|
|
|
- {
|
|
|
- ComputeRenderPassDescription& pass = rgraph.newComputeRenderPass("Cube refl apply indirect");
|
|
|
+ cmdb.bindShaderProgram(m_irradiance.m_grProg.get());
|
|
|
|
|
|
- pass.setWork([this](RenderPassWorkContext& rgraphCtx) {
|
|
|
- runIrradianceToRefl(rgraphCtx);
|
|
|
+ cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_nearestNearestClamp.get());
|
|
|
+
|
|
|
+ rgraphCtx.bindColorTexture(0, 1, probeTexture);
|
|
|
+
|
|
|
+ cmdb.bindUavBuffer(0, 3, m_irradiance.m_diceValuesBuff.get(), 0, m_irradiance.m_diceValuesBuff->getSize());
|
|
|
+
|
|
|
+ cmdb.dispatchCompute(1, 1, 1);
|
|
|
});
|
|
|
+ }
|
|
|
+
|
|
|
+ // Append irradiance back to refl cubemap
|
|
|
+ {
|
|
|
+ ComputeRenderPassDescription& pass = rgraph.newComputeRenderPass("Cube refl: Apply indirect");
|
|
|
|
|
|
for(U i = 0; i < kGBufferColorRenderTargetCount - 1; ++i)
|
|
|
{
|
|
|
- pass.newTextureDependency(m_ctx.m_gbufferColorRts[i], TextureUsageBit::kSampledCompute);
|
|
|
+ pass.newTextureDependency(gbufferColorRts[i], TextureUsageBit::kSampledCompute);
|
|
|
}
|
|
|
|
|
|
- TextureSubresourceInfo subresource;
|
|
|
- subresource.m_faceCount = 6;
|
|
|
- pass.newTextureDependency(m_ctx.m_lightShadingRt, TextureUsageBit::kUavComputeRead | TextureUsageBit::kUavComputeWrite, subresource);
|
|
|
+ pass.newTextureDependency(probeTexture, TextureUsageBit::kUavComputeRead | TextureUsageBit::kUavComputeWrite);
|
|
|
+
|
|
|
+ pass.newBufferDependency(irradianceDiceValuesBuffHandle, BufferUsageBit::kUavComputeRead);
|
|
|
+
|
|
|
+ pass.setWork([this, gbufferColorRts, probeTexture](RenderPassWorkContext& rgraphCtx) {
|
|
|
+ ANKI_TRACE_SCOPED_EVENT(ProbeReflections);
|
|
|
+
|
|
|
+ CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
|
|
|
+
|
|
|
+ cmdb.bindShaderProgram(m_irradianceToRefl.m_grProg.get());
|
|
|
+
|
|
|
+ // Bind resources
|
|
|
+ cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_nearestNearestClamp.get());
|
|
|
+
|
|
|
+ for(U i = 0; i < kGBufferColorRenderTargetCount - 1; ++i)
|
|
|
+ {
|
|
|
+ rgraphCtx.bindColorTexture(0, 1, gbufferColorRts[i], i);
|
|
|
+ }
|
|
|
+
|
|
|
+ cmdb.bindUavBuffer(0, 2, m_irradiance.m_diceValuesBuff.get(), 0, m_irradiance.m_diceValuesBuff->getSize());
|
|
|
+
|
|
|
+ for(U8 f = 0; f < 6; ++f)
|
|
|
+ {
|
|
|
+ TextureSubresourceInfo subresource;
|
|
|
+ subresource.m_faceCount = 1;
|
|
|
+ subresource.m_firstFace = f;
|
|
|
+ rgraphCtx.bindUavTexture(0, 3, probeTexture, subresource, f);
|
|
|
+ }
|
|
|
|
|
|
- pass.newBufferDependency(m_ctx.m_irradianceDiceValuesBuffHandle, BufferUsageBit::kUavComputeRead);
|
|
|
+ dispatchPPCompute(cmdb, 8, 8, m_lightShading.m_tileSize, m_lightShading.m_tileSize);
|
|
|
+ });
|
|
|
}
|
|
|
|
|
|
// Mipmapping "passes"
|
|
|
{
|
|
|
- static constexpr Array<CString, 6> passNames = {"Cube refl gen mips #0", "Cube refl gen mips #1", "Cube refl gen mips #2",
|
|
|
- "Cube refl gen mips #3", "Cube refl gen mips #4", "Cube refl gen mips #5"};
|
|
|
for(U32 faceIdx = 0; faceIdx < 6; ++faceIdx)
|
|
|
{
|
|
|
- GraphicsRenderPassDescription& pass = rgraph.newGraphicsRenderPass(passNames[faceIdx]);
|
|
|
- pass.setWork([this, faceIdx](RenderPassWorkContext& rgraphCtx) {
|
|
|
- runMipmappingOfLightShading(faceIdx, rgraphCtx);
|
|
|
- });
|
|
|
+ GraphicsRenderPassDescription& pass = rgraph.newGraphicsRenderPass(computeTempPassName("Cube refl: Gen mips", faceIdx));
|
|
|
|
|
|
TextureSubresourceInfo subresource(TextureSurfaceInfo(0, 0, faceIdx, 0));
|
|
|
subresource.m_mipmapCount = m_lightShading.m_mipCount;
|
|
|
+ pass.newTextureDependency(probeTexture, TextureUsageBit::kGenerateMipmaps, subresource);
|
|
|
|
|
|
- pass.newTextureDependency(m_ctx.m_lightShadingRt, TextureUsageBit::kGenerateMipmaps, subresource);
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-void ProbeReflections::runShadowMapping(const Array<GpuVisibilityOutput, 6>& visOuts, const Array<Mat4, 6>& viewProjMats,
|
|
|
- const Array<Mat3x4, 6>& viewMats, RenderPassWorkContext& rgraphCtx)
|
|
|
-{
|
|
|
- ANKI_TRACE_SCOPED_EVENT(ProbeReflections);
|
|
|
-
|
|
|
- CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
|
|
|
- cmdb.setPolygonOffset(kShadowsPolygonOffsetFactor, kShadowsPolygonOffsetUnits);
|
|
|
+ pass.setWork([this, faceIdx, probeTexture](RenderPassWorkContext& rgraphCtx) {
|
|
|
+ ANKI_TRACE_SCOPED_EVENT(ProbeReflections);
|
|
|
|
|
|
- const U32 faceIdx = rgraphCtx.m_currentSecondLevelCommandBufferIndex;
|
|
|
+ TextureSubresourceInfo subresource(TextureSurfaceInfo(0, 0, faceIdx, 0));
|
|
|
+ subresource.m_mipmapCount = m_lightShading.m_mipCount;
|
|
|
|
|
|
- const U32 rez = m_shadowMapping.m_rtDescr.m_height;
|
|
|
- cmdb.setViewport(rez * faceIdx, 0, rez, rez);
|
|
|
- cmdb.setScissor(rez * faceIdx, 0, rez, rez);
|
|
|
+ Texture* texToBind;
|
|
|
+ rgraphCtx.getRenderTargetState(probeTexture, subresource, texToBind);
|
|
|
|
|
|
- RenderableDrawerArguments args;
|
|
|
- args.m_viewMatrix = viewMats[faceIdx];
|
|
|
- args.m_cameraTransform = viewMats[faceIdx].getInverseTransformation();
|
|
|
- args.m_viewProjectionMatrix = viewProjMats[faceIdx];
|
|
|
- args.m_previousViewProjectionMatrix = Mat4::getIdentity(); // Don't care
|
|
|
- args.m_sampler = getRenderer().getSamplers().m_trilinearRepeatAniso.get();
|
|
|
- args.m_renderingTechinuqe = RenderingTechnique::kDepth;
|
|
|
- args.m_viewport = UVec4(rez * faceIdx, 0, rez, rez);
|
|
|
- args.fillMdi(visOuts[faceIdx]);
|
|
|
-
|
|
|
- getRenderer().getSceneDrawer().drawMdi(args, cmdb);
|
|
|
+ TextureViewInitInfo viewInit(texToBind, subresource);
|
|
|
+ TextureViewPtr view = GrManager::getSingleton().newTextureView(viewInit);
|
|
|
+ rgraphCtx.m_commandBuffer->generateMipmaps2d(view.get());
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
} // end namespace anki
|