ForwardShading.cpp 5.6 KB

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