ForwardShading.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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. RenderGraphDescription& rgraph = ctx.m_renderGraphDescr;
  24. const Array<F32, kMaxLodCount - 1> lodDistances = {g_lod0MaxDistanceCVar.get(), g_lod1MaxDistanceCVar.get()};
  25. FrustumGpuVisibilityInput visIn;
  26. visIn.m_passesName = "FW shading visibility";
  27. visIn.m_technique = RenderingTechnique::kForward;
  28. visIn.m_viewProjectionMatrix = ctx.m_matrices.m_viewProjection;
  29. visIn.m_lodReferencePoint = ctx.m_matrices.m_cameraTransform.getTranslationPart().xyz();
  30. visIn.m_lodDistances = lodDistances;
  31. visIn.m_rgraph = &rgraph;
  32. visIn.m_gatherAabbIndices = g_dbgCVar.get();
  33. RenderTargetHandle hzb = getRenderer().getGBuffer().getHzbRt();
  34. visIn.m_hzbRt = &hzb;
  35. getRenderer().getGpuVisibility().populateRenderGraph(visIn, m_runCtx.m_visOut);
  36. }
  37. void ForwardShading::run(const RenderingContext& ctx, RenderPassWorkContext& rgraphCtx)
  38. {
  39. ANKI_TRACE_SCOPED_EVENT(ForwardShading);
  40. CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
  41. // Set state
  42. cmdb.setDepthWrite(false);
  43. cmdb.setBlendFactors(0, BlendFactor::kSrcAlpha, BlendFactor::kOneMinusSrcAlpha);
  44. // Bind stuff
  45. const U32 set = U32(MaterialSet::kGlobal);
  46. cmdb.bindSampler(set, U32(MaterialBinding::kLinearClampSampler), getRenderer().getSamplers().m_trilinearClamp.get());
  47. cmdb.bindSampler(set, U32(MaterialBinding::kShadowSampler), getRenderer().getSamplers().m_trilinearClampShadow.get());
  48. rgraphCtx.bindTexture(set, U32(MaterialBinding::kDepthRt), getRenderer().getDepthDownscale().getRt(), DepthDownscale::kQuarterInternalResolution);
  49. rgraphCtx.bindColorTexture(set, U32(MaterialBinding::kLightVolume), getRenderer().getVolumetricLightingAccumulation().getRt());
  50. cmdb.bindConstantBuffer(set, U32(MaterialBinding::kClusterShadingConstants), getRenderer().getClusterBinning().getClusteredShadingConstants());
  51. cmdb.bindUavBuffer(set, U32(MaterialBinding::kClusterShadingLights),
  52. getRenderer().getClusterBinning().getPackedObjectsBuffer(GpuSceneNonRenderableObjectType::kLight));
  53. rgraphCtx.bindColorTexture(set, U32(MaterialBinding::kClusterShadingLights) + 1, getRenderer().getShadowMapping().getShadowmapRt());
  54. cmdb.bindUavBuffer(set, U32(MaterialBinding::kClusters), getRenderer().getClusterBinning().getClustersBuffer());
  55. // Draw
  56. RenderableDrawerArguments args;
  57. args.m_viewMatrix = ctx.m_matrices.m_view;
  58. args.m_cameraTransform = ctx.m_matrices.m_cameraTransform;
  59. args.m_viewProjectionMatrix = ctx.m_matrices.m_viewProjectionJitter;
  60. args.m_previousViewProjectionMatrix = ctx.m_matrices.m_jitter * ctx.m_prevMatrices.m_viewProjection;
  61. args.m_sampler = getRenderer().getSamplers().m_trilinearRepeatAnisoResolutionScalingBias.get();
  62. args.m_renderingTechinuqe = RenderingTechnique::kForward;
  63. args.fillMdi(m_runCtx.m_visOut);
  64. getRenderer().getSceneDrawer().drawMdi(args, cmdb);
  65. // Restore state
  66. cmdb.setDepthWrite(true);
  67. cmdb.setBlendFactors(0, BlendFactor::kOne, BlendFactor::kZero);
  68. // Do lens flares
  69. getRenderer().getLensFlare().runDrawFlares(ctx, cmdb);
  70. }
  71. void ForwardShading::setDependencies(GraphicsRenderPassDescription& pass)
  72. {
  73. pass.newTextureDependency(getRenderer().getDepthDownscale().getRt(), TextureUsageBit::kSampledFragment,
  74. DepthDownscale::kQuarterInternalResolution);
  75. pass.newTextureDependency(getRenderer().getVolumetricLightingAccumulation().getRt(), TextureUsageBit::kSampledFragment);
  76. if(getRenderer().getLensFlare().getIndirectDrawBuffer().isValid())
  77. {
  78. pass.newBufferDependency(getRenderer().getLensFlare().getIndirectDrawBuffer(), BufferUsageBit::kIndirectDraw);
  79. }
  80. pass.newBufferDependency(m_runCtx.m_visOut.m_someBufferHandle, BufferUsageBit::kIndirectDraw);
  81. }
  82. } // end namespace anki