ForwardShading.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  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_cvarRenderLod0MaxDistance, g_cvarRenderLod1MaxDistance};
  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 = !!(getDbg().getOptions() & DbgOption::kGatherAabbs);
  35. RenderTargetHandle hzb = getGBuffer().getHzbRt();
  36. visIn.m_hzbRt = &hzb;
  37. visIn.m_viewportSize = getRenderer().getInternalResolution();
  38. getRenderer().getGpuVisibility().populateRenderGraph(visIn, m_runCtx.m_visOut);
  39. }
  40. void ForwardShading::run(const RenderingContext& ctx, RenderPassWorkContext& rgraphCtx)
  41. {
  42. ANKI_TRACE_SCOPED_EVENT(ForwardShading);
  43. CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
  44. if(m_runCtx.m_visOut.containsDrawcalls())
  45. {
  46. // Set state
  47. cmdb.setDepthWrite(false);
  48. cmdb.setBlendFactors(0, BlendFactor::kSrcAlpha, BlendFactor::kOneMinusSrcAlpha);
  49. // Bind stuff
  50. cmdb.bindSampler(ANKI_MATERIAL_REGISTER_LINEAR_CLAMP_SAMPLER, 0, getRenderer().getSamplers().m_trilinearClamp.get());
  51. cmdb.bindSampler(ANKI_MATERIAL_REGISTER_SHADOW_SAMPLER, 0, getRenderer().getSamplers().m_trilinearClampShadow.get());
  52. rgraphCtx.bindSrv(ANKI_MATERIAL_REGISTER_SCENE_DEPTH, 0, getDepthDownscale().getRt(), DepthDownscale::kQuarterInternalResolution);
  53. rgraphCtx.bindSrv(ANKI_MATERIAL_REGISTER_LIGHT_VOLUME, 0, getRenderer().getVolumetricLightingAccumulation().getRt());
  54. cmdb.bindConstantBuffer(ANKI_MATERIAL_REGISTER_CLUSTER_SHADING_CONSTANTS, 0, ctx.m_globalRenderingConstantsBuffer);
  55. cmdb.bindSrv(ANKI_MATERIAL_REGISTER_CLUSTER_SHADING_POINT_LIGHTS, 0,
  56. getClusterBinning().getPackedObjectsBuffer(GpuSceneNonRenderableObjectType::kLight));
  57. cmdb.bindSrv(ANKI_MATERIAL_REGISTER_CLUSTER_SHADING_SPOT_LIGHTS, 0,
  58. getClusterBinning().getPackedObjectsBuffer(GpuSceneNonRenderableObjectType::kLight));
  59. rgraphCtx.bindSrv(ANKI_MATERIAL_REGISTER_SHADOW_ATLAS, 0, getShadowMapping().getShadowmapRt());
  60. cmdb.bindSrv(ANKI_MATERIAL_REGISTER_CLUSTERS, 0, getClusterBinning().getClustersBuffer());
  61. // Draw
  62. RenderableDrawerArguments args;
  63. args.m_viewMatrix = ctx.m_matrices.m_view;
  64. args.m_cameraTransform = ctx.m_matrices.m_cameraTransform;
  65. args.m_viewProjectionMatrix = ctx.m_matrices.m_viewProjectionJitter;
  66. args.m_previousViewProjectionMatrix = ctx.m_matrices.m_jitter * ctx.m_prevMatrices.m_viewProjection;
  67. args.m_sampler = getRenderer().getSamplers().m_trilinearRepeatAnisoResolutionScalingBias.get();
  68. args.m_renderingTechinuqe = RenderingTechnique::kForward;
  69. args.m_viewport = UVec4(0, 0, getRenderer().getInternalResolution());
  70. args.fill(m_runCtx.m_visOut);
  71. getRenderer().getRenderableDrawer().drawMdi(args, cmdb);
  72. // Restore state
  73. cmdb.setDepthWrite(true);
  74. cmdb.setBlendFactors(0, BlendFactor::kOne, BlendFactor::kZero);
  75. }
  76. // Do lens flares
  77. getRenderer().getLensFlare().runDrawFlares(ctx, cmdb);
  78. }
  79. void ForwardShading::setDependencies(GraphicsRenderPass& pass)
  80. {
  81. pass.newTextureDependency(getDepthDownscale().getRt(), TextureUsageBit::kSrvPixel, DepthDownscale::kQuarterInternalResolution);
  82. pass.newTextureDependency(getRenderer().getVolumetricLightingAccumulation().getRt(), TextureUsageBit::kSrvPixel);
  83. if(getRenderer().getLensFlare().getIndirectDrawBuffer().isValid())
  84. {
  85. pass.newBufferDependency(getRenderer().getLensFlare().getIndirectDrawBuffer(), BufferUsageBit::kIndirectDraw);
  86. }
  87. if(m_runCtx.m_visOut.containsDrawcalls())
  88. {
  89. pass.newBufferDependency(m_runCtx.m_visOut.m_dependency, BufferUsageBit::kIndirectDraw);
  90. }
  91. }
  92. } // end namespace anki