ForwardShading.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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/RenderQueue.h>
  8. #include <AnKi/Renderer/GBuffer.h>
  9. #include <AnKi/Renderer/LightShading.h>
  10. #include <AnKi/Renderer/ShadowMapping.h>
  11. #include <AnKi/Renderer/DepthDownscale.h>
  12. #include <AnKi/Renderer/LensFlare.h>
  13. #include <AnKi/Renderer/ClusterBinning.h>
  14. #include <AnKi/Renderer/PackVisibleClusteredObjects.h>
  15. #include <AnKi/Renderer/LensFlare.h>
  16. #include <AnKi/Renderer/VolumetricLightingAccumulation.h>
  17. #include <AnKi/Shaders/Include/MaterialTypes.h>
  18. namespace anki {
  19. void ForwardShading::run(const RenderingContext& ctx, RenderPassWorkContext& rgraphCtx)
  20. {
  21. CommandBufferPtr& cmdb = rgraphCtx.m_commandBuffer;
  22. const U32 threadId = rgraphCtx.m_currentSecondLevelCommandBufferIndex;
  23. const U32 threadCount = rgraphCtx.m_secondLevelCommandBufferCount;
  24. const U32 problemSize = ctx.m_renderQueue->m_forwardShadingRenderables.getSize();
  25. U32 start, end;
  26. splitThreadedProblem(threadId, threadCount, problemSize, start, end);
  27. if(start != end)
  28. {
  29. cmdb->setDepthWrite(false);
  30. cmdb->setBlendFactors(0, BlendFactor::kSrcAlpha, BlendFactor::kOneMinusSrcAlpha);
  31. const U32 set = U32(MaterialSet::kGlobal);
  32. cmdb->bindSampler(set, U32(MaterialBinding::kLinearClampSampler), getRenderer().getSamplers().m_trilinearClamp.get());
  33. cmdb->bindSampler(set, U32(MaterialBinding::kShadowSampler), getRenderer().getSamplers().m_trilinearClampShadow.get());
  34. rgraphCtx.bindTexture(set, U32(MaterialBinding::kDepthRt), getRenderer().getDepthDownscale().getHiZRt(), kHiZHalfSurface);
  35. rgraphCtx.bindColorTexture(set, U32(MaterialBinding::kLightVolume), getRenderer().getVolumetricLightingAccumulation().getRt());
  36. bindUniforms(cmdb, set, U32(MaterialBinding::kClusterShadingUniforms), getRenderer().getClusterBinning().getClusteredUniformsRebarToken());
  37. getRenderer().getPackVisibleClusteredObjects().bindClusteredObjectBuffer(cmdb, set, U32(MaterialBinding::kClusterShadingLights),
  38. ClusteredObjectType::kPointLight);
  39. getRenderer().getPackVisibleClusteredObjects().bindClusteredObjectBuffer(cmdb, set, U32(MaterialBinding::kClusterShadingLights) + 1,
  40. ClusteredObjectType::kSpotLight);
  41. rgraphCtx.bindColorTexture(set, U32(MaterialBinding::kClusterShadingLights) + 2, getRenderer().getShadowMapping().getShadowmapRt());
  42. bindStorage(cmdb, set, U32(MaterialBinding::kClusters), getRenderer().getClusterBinning().getClustersRebarToken());
  43. RenderableDrawerArguments args;
  44. args.m_viewMatrix = ctx.m_matrices.m_view;
  45. args.m_cameraTransform = ctx.m_matrices.m_cameraTransform;
  46. args.m_viewProjectionMatrix = ctx.m_matrices.m_viewProjectionJitter;
  47. args.m_previousViewProjectionMatrix = ctx.m_prevMatrices.m_viewProjectionJitter; // Not sure about that
  48. args.m_sampler = getRenderer().getSamplers().m_trilinearRepeatAnisoResolutionScalingBias.get();
  49. // Start drawing
  50. getRenderer().getSceneDrawer().drawRange(args, ctx.m_renderQueue->m_forwardShadingRenderables.getBegin() + start,
  51. ctx.m_renderQueue->m_forwardShadingRenderables.getBegin() + end, cmdb);
  52. // Restore state
  53. cmdb->setDepthWrite(true);
  54. cmdb->setBlendFactors(0, BlendFactor::kOne, BlendFactor::kZero);
  55. }
  56. if(threadId == threadCount - 1 && ctx.m_renderQueue->m_lensFlares.getSize())
  57. {
  58. getRenderer().getLensFlare().runDrawFlares(ctx, cmdb);
  59. }
  60. }
  61. void ForwardShading::setDependencies(const RenderingContext& ctx, GraphicsRenderPassDescription& pass)
  62. {
  63. pass.newTextureDependency(getRenderer().getDepthDownscale().getHiZRt(), TextureUsageBit::kSampledFragment, kHiZHalfSurface);
  64. pass.newTextureDependency(getRenderer().getVolumetricLightingAccumulation().getRt(), TextureUsageBit::kSampledFragment);
  65. if(ctx.m_renderQueue->m_lensFlares.getSize())
  66. {
  67. pass.newBufferDependency(getRenderer().getLensFlare().getIndirectDrawBuffer(), BufferUsageBit::kIndirectDraw);
  68. }
  69. }
  70. } // end namespace anki