ForwardShading.cpp 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  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/ForwardShading.h>
  6. #include <AnKi/Renderer/Renderer.h>
  7. #include <AnKi/Renderer/GBuffer.h>
  8. #include <AnKi/Renderer/LightShading.h>
  9. #include <AnKi/Renderer/ShadowMapping.h>
  10. #include <AnKi/Renderer/DepthDownscale.h>
  11. #include <AnKi/Renderer/LensFlare.h>
  12. #include <AnKi/Renderer/ClusterBinning.h>
  13. #include <AnKi/Renderer/LensFlare.h>
  14. #include <AnKi/Renderer/GBuffer.h>
  15. #include <AnKi/Renderer/Dbg.h>
  16. #include <AnKi/Renderer/VolumetricLightingAccumulation.h>
  17. #include <AnKi/Shaders/Include/MaterialTypes.h>
  18. #include <AnKi/Core/App.h>
  19. #include <AnKi/Util/Tracer.h>
  20. namespace anki {
  21. void ForwardShading::populateRenderGraph(RenderingContext& ctx)
  22. {
  23. m_runCtx = {};
  24. RenderGraphDescription& rgraph = ctx.m_renderGraphDescr;
  25. const Array<F32, kMaxLodCount - 1> lodDistances = {g_lod0MaxDistanceCVar.get(), g_lod1MaxDistanceCVar.get()};
  26. FrustumGpuVisibilityInput visIn;
  27. visIn.m_passesName = "FW shading";
  28. visIn.m_technique = RenderingTechnique::kForward;
  29. visIn.m_viewProjectionMatrix = ctx.m_matrices.m_viewProjection;
  30. visIn.m_lodReferencePoint = ctx.m_matrices.m_cameraTransform.getTranslationPart().xyz();
  31. visIn.m_lodDistances = lodDistances;
  32. visIn.m_rgraph = &rgraph;
  33. visIn.m_gatherAabbIndices = g_dbgCVar.get();
  34. RenderTargetHandle hzb = getRenderer().getGBuffer().getHzbRt();
  35. visIn.m_hzbRt = &hzb;
  36. visIn.m_viewportSize = getRenderer().getInternalResolution();
  37. getRenderer().getGpuVisibility().populateRenderGraph(visIn, m_runCtx.m_visOut);
  38. if(getRenderer().runSoftwareMeshletRendering())
  39. {
  40. GpuMeshletVisibilityInput meshIn;
  41. meshIn.m_passesName = "FW shading";
  42. meshIn.m_technique = RenderingTechnique::kForward;
  43. meshIn.m_viewProjectionMatrix = ctx.m_matrices.m_viewProjection;
  44. meshIn.m_cameraTransform = ctx.m_matrices.m_cameraTransform;
  45. meshIn.m_viewportSize = getRenderer().getInternalResolution();
  46. meshIn.m_rgraph = &rgraph;
  47. meshIn.m_hzbRt = getRenderer().getGBuffer().getHzbRt();
  48. meshIn.fillBuffers(m_runCtx.m_visOut);
  49. getRenderer().getGpuVisibility().populateRenderGraph(meshIn, m_runCtx.m_meshVisOut);
  50. }
  51. }
  52. void ForwardShading::run(const RenderingContext& ctx, RenderPassWorkContext& rgraphCtx)
  53. {
  54. ANKI_TRACE_SCOPED_EVENT(ForwardShading);
  55. CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
  56. if(m_runCtx.m_visOut.containsDrawcalls())
  57. {
  58. // Set state
  59. cmdb.setDepthWrite(false);
  60. cmdb.setBlendFactors(0, BlendFactor::kSrcAlpha, BlendFactor::kOneMinusSrcAlpha);
  61. // Bind stuff
  62. const U32 set = U32(MaterialSet::kGlobal);
  63. cmdb.bindSampler(set, U32(MaterialBinding::kLinearClampSampler), getRenderer().getSamplers().m_trilinearClamp.get());
  64. cmdb.bindSampler(set, U32(MaterialBinding::kShadowSampler), getRenderer().getSamplers().m_trilinearClampShadow.get());
  65. rgraphCtx.bindTexture(set, U32(MaterialBinding::kDepthRt), getRenderer().getDepthDownscale().getRt(),
  66. DepthDownscale::kQuarterInternalResolution);
  67. rgraphCtx.bindColorTexture(set, U32(MaterialBinding::kLightVolume), getRenderer().getVolumetricLightingAccumulation().getRt());
  68. cmdb.bindConstantBuffer(set, U32(MaterialBinding::kClusterShadingConstants),
  69. getRenderer().getClusterBinning().getClusteredShadingConstants());
  70. cmdb.bindUavBuffer(set, U32(MaterialBinding::kClusterShadingLights),
  71. getRenderer().getClusterBinning().getPackedObjectsBuffer(GpuSceneNonRenderableObjectType::kLight));
  72. rgraphCtx.bindColorTexture(set, U32(MaterialBinding::kClusterShadingLights) + 1, getRenderer().getShadowMapping().getShadowmapRt());
  73. cmdb.bindUavBuffer(set, U32(MaterialBinding::kClusters), getRenderer().getClusterBinning().getClustersBuffer());
  74. // Draw
  75. RenderableDrawerArguments args;
  76. args.m_viewMatrix = ctx.m_matrices.m_view;
  77. args.m_cameraTransform = ctx.m_matrices.m_cameraTransform;
  78. args.m_viewProjectionMatrix = ctx.m_matrices.m_viewProjectionJitter;
  79. args.m_previousViewProjectionMatrix = ctx.m_matrices.m_jitter * ctx.m_prevMatrices.m_viewProjection;
  80. args.m_sampler = getRenderer().getSamplers().m_trilinearRepeatAnisoResolutionScalingBias.get();
  81. args.m_renderingTechinuqe = RenderingTechnique::kForward;
  82. args.m_viewport = UVec4(0, 0, getRenderer().getInternalResolution());
  83. args.fill(m_runCtx.m_visOut);
  84. if(m_runCtx.m_meshVisOut.isFilled())
  85. {
  86. args.fill(m_runCtx.m_meshVisOut);
  87. }
  88. getRenderer().getSceneDrawer().drawMdi(args, cmdb);
  89. // Restore state
  90. cmdb.setDepthWrite(true);
  91. cmdb.setBlendFactors(0, BlendFactor::kOne, BlendFactor::kZero);
  92. }
  93. // Do lens flares
  94. getRenderer().getLensFlare().runDrawFlares(ctx, cmdb);
  95. }
  96. void ForwardShading::setDependencies(GraphicsRenderPassDescription& pass)
  97. {
  98. pass.newTextureDependency(getRenderer().getDepthDownscale().getRt(), TextureUsageBit::kSampledFragment,
  99. DepthDownscale::kQuarterInternalResolution);
  100. pass.newTextureDependency(getRenderer().getVolumetricLightingAccumulation().getRt(), TextureUsageBit::kSampledFragment);
  101. if(getRenderer().getLensFlare().getIndirectDrawBuffer().isValid())
  102. {
  103. pass.newBufferDependency(getRenderer().getLensFlare().getIndirectDrawBuffer(), BufferUsageBit::kIndirectDraw);
  104. }
  105. if(m_runCtx.m_visOut.containsDrawcalls())
  106. {
  107. pass.newBufferDependency((m_runCtx.m_meshVisOut.isFilled()) ? m_runCtx.m_meshVisOut.m_dependency : m_runCtx.m_visOut.m_dependency,
  108. BufferUsageBit::kIndirectDraw);
  109. }
  110. }
  111. } // end namespace anki