GBufferPost.cpp 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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/GBufferPost.h>
  6. #include <AnKi/Renderer/Renderer.h>
  7. #include <AnKi/Renderer/GBuffer.h>
  8. #include <AnKi/Renderer/ClusterBinning.h>
  9. #include <AnKi/Util/Tracer.h>
  10. namespace anki {
  11. Error GBufferPost::init()
  12. {
  13. const Error err = initInternal();
  14. if(err)
  15. {
  16. ANKI_R_LOGE("Failed to initialize GBufferPost pass");
  17. }
  18. return err;
  19. }
  20. Error GBufferPost::initInternal()
  21. {
  22. ANKI_R_LOGV("Initializing GBufferPost pass");
  23. // Load shaders
  24. ANKI_CHECK(loadShaderProgram("ShaderBinaries/GBufferPost.ankiprogbin", m_prog, m_grProg));
  25. return Error::kNone;
  26. }
  27. void GBufferPost::populateRenderGraph(RenderingContext& ctx)
  28. {
  29. ANKI_TRACE_SCOPED_EVENT(GBufferPost);
  30. if(GpuSceneArrays::Decal::getSingleton().getElementCount() == 0)
  31. {
  32. // If there are no decals don't bother
  33. return;
  34. }
  35. RenderGraphBuilder& rgraph = ctx.m_renderGraphDescr;
  36. // Create pass
  37. GraphicsRenderPass& rpass = rgraph.newGraphicsRenderPass("GBuffPost");
  38. rpass.setWork([this, &ctx](RenderPassWorkContext& rgraphCtx) {
  39. CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
  40. cmdb.setViewport(0, 0, getRenderer().getInternalResolution().x(), getRenderer().getInternalResolution().y());
  41. cmdb.bindShaderProgram(m_grProg.get());
  42. cmdb.setBlendFactors(0, BlendFactor::kOne, BlendFactor::kSrcAlpha, BlendFactor::kZero, BlendFactor::kOne);
  43. cmdb.setBlendFactors(1, BlendFactor::kOne, BlendFactor::kSrcAlpha, BlendFactor::kZero, BlendFactor::kOne);
  44. // Bind all
  45. cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_nearestNearestClamp.get());
  46. rgraphCtx.bindSrv(0, 0, getRenderer().getGBuffer().getDepthRt());
  47. cmdb.bindSampler(1, 0, getRenderer().getSamplers().m_trilinearRepeat.get());
  48. cmdb.bindConstantBuffer(0, 0, ctx.m_globalRenderingConstantsBuffer);
  49. cmdb.bindSrv(0, 0, getRenderer().getClusterBinning().getPackedObjectsBuffer(GpuSceneNonRenderableObjectType::kDecal));
  50. cmdb.bindSrv(1, 0, getRenderer().getClusterBinning().getClustersBuffer());
  51. // Draw
  52. cmdb.draw(PrimitiveTopology::kTriangles, 3);
  53. // Restore state
  54. cmdb.setBlendFactors(0, BlendFactor::kOne, BlendFactor::kZero);
  55. cmdb.setBlendFactors(1, BlendFactor::kOne, BlendFactor::kZero);
  56. });
  57. GraphicsRenderPassTargetDesc rt0(getRenderer().getGBuffer().getColorRt(0));
  58. rt0.m_loadOperation = RenderTargetLoadOperation::kLoad;
  59. GraphicsRenderPassTargetDesc rt1(getRenderer().getGBuffer().getColorRt(1));
  60. rt1.m_loadOperation = RenderTargetLoadOperation::kLoad;
  61. rpass.setRenderpassInfo({rt0, rt1});
  62. rpass.newTextureDependency(getRenderer().getGBuffer().getColorRt(0), TextureUsageBit::kAllRtvDsv);
  63. rpass.newTextureDependency(getRenderer().getGBuffer().getColorRt(1), TextureUsageBit::kAllRtvDsv);
  64. rpass.newTextureDependency(getRenderer().getGBuffer().getDepthRt(), TextureUsageBit::kSrvFragment);
  65. rpass.newBufferDependency(getRenderer().getClusterBinning().getClustersBufferHandle(), BufferUsageBit::kSrvFragment);
  66. rpass.newBufferDependency(getRenderer().getClusterBinning().getPackedObjectsBufferHandle(GpuSceneNonRenderableObjectType::kDecal),
  67. BufferUsageBit::kSrvFragment);
  68. }
  69. } // end namespace anki