AccelerationStructureBuilder.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. // Copyright (C) 2009-present, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #include <AnKi/Renderer/AccelerationStructureBuilder.h>
  6. #include <AnKi/Renderer/Renderer.h>
  7. #include <AnKi/Renderer/Utils/GpuVisibility.h>
  8. #include <AnKi/Util/Tracer.h>
  9. #include <AnKi/Core/App.h>
  10. #include <AnKi/GpuMemory/GpuVisibleTransientMemoryPool.h>
  11. namespace anki {
  12. void AccelerationStructureBuilder::populateRenderGraph(RenderingContext& ctx)
  13. {
  14. ANKI_TRACE_SCOPED_EVENT(ASBuilder);
  15. // Do visibility
  16. GpuVisibilityAccelerationStructuresOutput visOut;
  17. {
  18. const Array<F32, kMaxLodCount - 1> lodDistances = {g_lod0MaxDistanceCVar, g_lod1MaxDistanceCVar};
  19. GpuVisibilityAccelerationStructuresInput in;
  20. in.m_passesName = "Main TLAS visiblity";
  21. in.m_lodReferencePoint = ctx.m_matrices.m_cameraTransform.getTranslationPart().xyz();
  22. in.m_lodDistances = lodDistances;
  23. in.m_pointOfTest = in.m_lodReferencePoint;
  24. in.m_testRadius = g_rayTracingExtendedFrustumDistanceCVar;
  25. in.m_viewProjectionMatrix = ctx.m_matrices.m_viewProjection;
  26. in.m_rgraph = &ctx.m_renderGraphDescr;
  27. getRenderer().getGpuVisibilityAccelerationStructures().pupulateRenderGraph(in, visOut);
  28. m_runCtx.m_dependency = visOut.m_dependency;
  29. m_runCtx.m_visibleRenderablesBuff = visOut.m_renderablesBuffer;
  30. m_runCtx.m_buildSbtIndirectArgsBuff = visOut.m_buildSbtIndirectArgsBuffer;
  31. }
  32. // Create the TLAS
  33. AccelerationStructureInitInfo initInf("Main TLAS");
  34. initInf.m_type = AccelerationStructureType::kTopLevel;
  35. initInf.m_topLevel.m_instanceCount = GpuSceneArrays::RenderableBoundingVolumeRt::getSingleton().getElementCount();
  36. initInf.m_topLevel.m_instancesBuffer = visOut.m_instancesBuffer;
  37. m_runCtx.m_tlas = GrManager::getSingleton().newAccelerationStructure(initInf);
  38. // Build the AS
  39. {
  40. RenderGraphBuilder& rgraph = ctx.m_renderGraphDescr;
  41. const BufferView scratchBuff = GpuVisibleTransientMemoryPool::getSingleton().allocate(m_runCtx.m_tlas->getBuildScratchBufferSize(), 1);
  42. m_runCtx.m_tlasHandle = rgraph.importAccelerationStructure(m_runCtx.m_tlas.get(), AccelerationStructureUsageBit::kNone);
  43. NonGraphicsRenderPass& rpass = rgraph.newNonGraphicsRenderPass("Build TLAS");
  44. rpass.newAccelerationStructureDependency(m_runCtx.m_tlasHandle, AccelerationStructureUsageBit::kBuild);
  45. rpass.newBufferDependency(visOut.m_dependency, BufferUsageBit::kAccelerationStructureBuild);
  46. rpass.setWork([this, scratchBuff](RenderPassWorkContext& rgraphCtx) {
  47. ANKI_TRACE_SCOPED_EVENT(ASBuilder);
  48. rgraphCtx.m_commandBuffer->buildAccelerationStructure(m_runCtx.m_tlas.get(), scratchBuff);
  49. });
  50. }
  51. // Light visibility
  52. {
  53. GpuVisibilityLocalLightsInput in;
  54. in.m_cellCounts = UVec3(g_lightGridCellCountXZCVar, g_lightGridCellCountYCVar, g_lightGridCellCountXZCVar);
  55. in.m_cellSize = Vec3(g_lightGridSizeXZCVar, g_lightGridSizeYCVar, g_lightGridSizeXZCVar) / Vec3(in.m_cellCounts);
  56. in.m_cameraPosition = ctx.m_matrices.m_cameraTransform.getTranslationPart().xyz();
  57. in.m_lookDirection = -ctx.m_matrices.m_cameraTransform.getRotationPart().getZAxis();
  58. in.m_lightIndexListSize = g_lightIndexListSizeCVar;
  59. in.m_rgraph = &ctx.m_renderGraphDescr;
  60. getGpuVisibilityLocalLights().populateRenderGraph(in, m_runCtx.m_lightVisInfo);
  61. m_runCtx.m_lightGridConsts.m_volumeMin = m_runCtx.m_lightVisInfo.m_lightGridMin;
  62. m_runCtx.m_lightGridConsts.m_volumeMax = m_runCtx.m_lightVisInfo.m_lightGridMax;
  63. m_runCtx.m_lightGridConsts.m_cellCounts = in.m_cellCounts;
  64. m_runCtx.m_lightGridConsts.m_cellSize = in.m_cellSize;
  65. }
  66. }
  67. } // end namespace anki