AccelerationStructureBuilder.cpp 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. // Copyright (C) 2009-2023, 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/RenderQueue.h>
  7. #include <AnKi/Renderer/Renderer.h>
  8. #include <AnKi/Util/Tracer.h>
  9. #include <AnKi/Core/App.h>
  10. #include <AnKi/Core/GpuMemory/GpuVisibleTransientMemoryPool.h>
  11. namespace anki {
  12. static NumericCVar<F32>
  13. g_rayTracingExtendedFrustumDistanceCVar(CVarSubsystem::kRenderer, "RayTracingExtendedFrustumDistance", 100.0f, 10.0f, 10000.0f,
  14. "Every object that its distance from the camera is bellow that value will take part in ray tracing");
  15. void AccelerationStructureBuilder::populateRenderGraph(RenderingContext& ctx)
  16. {
  17. ANKI_TRACE_SCOPED_EVENT(RTlas);
  18. // Do visibility
  19. GpuVisibilityAccelerationStructuresOutput visOut;
  20. {
  21. const Array<F32, kMaxLodCount - 1> lodDistances = {g_lod0MaxDistanceCVar.get(), g_lod1MaxDistanceCVar.get()};
  22. GpuVisibilityAccelerationStructuresInput in;
  23. in.m_passesName = "Main TLAS visiblity";
  24. in.m_lodReferencePoint = ctx.m_matrices.m_cameraTransform.getTranslationPart().xyz();
  25. in.m_lodDistances = lodDistances;
  26. in.m_pointOfTest = in.m_lodReferencePoint;
  27. in.m_testRadius = g_rayTracingExtendedFrustumDistanceCVar.get();
  28. in.m_viewProjectionMatrix = ctx.m_matrices.m_viewProjection;
  29. in.m_rgraph = &ctx.m_renderGraphDescr;
  30. getRenderer().getGpuVisibilityAccelerationStructures().pupulateRenderGraph(in, visOut);
  31. m_runCtx.m_visibilityHandle = visOut.m_someBufferHandle;
  32. m_runCtx.m_visibleRenderableIndicesBuff = visOut.m_renderableIndicesBuffer;
  33. }
  34. // Create the TLAS
  35. AccelerationStructureInitInfo initInf("Main TLAS");
  36. initInf.m_type = AccelerationStructureType::kTopLevel;
  37. initInf.m_topLevel.m_indirectArgs.m_maxInstanceCount = GpuSceneArrays::RenderableAabbRt::getSingleton().getElementCount();
  38. initInf.m_topLevel.m_indirectArgs.m_instancesBuffer = visOut.m_instancesBuffer.m_buffer;
  39. initInf.m_topLevel.m_indirectArgs.m_instancesBufferOffset = visOut.m_instancesBuffer.m_offset;
  40. m_runCtx.m_tlas = GrManager::getSingleton().newAccelerationStructure(initInf);
  41. // Build the AS
  42. {
  43. RenderGraphDescription& rgraph = ctx.m_renderGraphDescr;
  44. const BufferOffsetRange scratchBuff = GpuVisibleTransientMemoryPool::getSingleton().allocate(m_runCtx.m_tlas->getBuildScratchBufferSize());
  45. m_runCtx.m_tlasHandle = rgraph.importAccelerationStructure(m_runCtx.m_tlas.get(), AccelerationStructureUsageBit::kNone);
  46. ComputeRenderPassDescription& rpass = rgraph.newComputeRenderPass("Build TLAS");
  47. rpass.newAccelerationStructureDependency(m_runCtx.m_tlasHandle, AccelerationStructureUsageBit::kBuild);
  48. rpass.newBufferDependency(visOut.m_someBufferHandle, BufferUsageBit::kAccelerationStructureBuild);
  49. rpass.setWork([this, scratchBuff, rangeBuff = visOut.m_rangeBuffer](RenderPassWorkContext& rgraphCtx) {
  50. ANKI_TRACE_SCOPED_EVENT(RTlas);
  51. rgraphCtx.m_commandBuffer->buildAccelerationStructureIndirect(m_runCtx.m_tlas.get(), scratchBuff.m_buffer, scratchBuff.m_offset,
  52. rangeBuff.m_buffer, rangeBuff.m_offset);
  53. });
  54. }
  55. }
  56. } // end namespace anki