GBufferPost.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. // Copyright (C) 2009-2021, 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/LightShading.h>
  9. namespace anki {
  10. GBufferPost::~GBufferPost()
  11. {
  12. }
  13. Error GBufferPost::init()
  14. {
  15. const Error err = initInternal();
  16. if(err)
  17. {
  18. ANKI_R_LOGE("Failed to initialize GBufferPost pass");
  19. }
  20. return err;
  21. }
  22. Error GBufferPost::initInternal()
  23. {
  24. ANKI_R_LOGI("Initializing GBufferPost pass");
  25. // Load shaders
  26. ANKI_CHECK(getResourceManager().loadResource("Shaders/GBufferPost.ankiprog", m_prog));
  27. ShaderProgramResourceVariantInitInfo variantInitInfo(m_prog);
  28. variantInitInfo.addConstant("TILE_COUNTS", m_r->getTileCounts());
  29. variantInitInfo.addConstant("Z_SPLIT_COUNT", m_r->getZSplitCount());
  30. variantInitInfo.addConstant("TILE_SIZE", m_r->getTileSize());
  31. const ShaderProgramResourceVariant* variant;
  32. m_prog->getOrCreateVariant(variantInitInfo, variant);
  33. m_grProg = variant->getProgram();
  34. // Create FB descr
  35. m_fbDescr.m_colorAttachmentCount = 2;
  36. m_fbDescr.m_colorAttachments[0].m_loadOperation = AttachmentLoadOperation::LOAD;
  37. m_fbDescr.m_colorAttachments[1].m_loadOperation = AttachmentLoadOperation::LOAD;
  38. m_fbDescr.bake();
  39. return Error::NONE;
  40. }
  41. void GBufferPost::populateRenderGraph(RenderingContext& ctx)
  42. {
  43. RenderGraphDescription& rgraph = ctx.m_renderGraphDescr;
  44. // Create pass
  45. GraphicsRenderPassDescription& rpass = rgraph.newGraphicsRenderPass("GBuffPost");
  46. rpass.setWork([this, &ctx](RenderPassWorkContext& rgraphCtx) {
  47. run(ctx, rgraphCtx);
  48. });
  49. rpass.setFramebufferInfo(m_fbDescr, {m_r->getGBuffer().getColorRt(0), m_r->getGBuffer().getColorRt(1)}, {});
  50. rpass.newDependency(
  51. RenderPassDependency(m_r->getGBuffer().getColorRt(0), TextureUsageBit::ALL_FRAMEBUFFER_ATTACHMENT));
  52. rpass.newDependency(
  53. RenderPassDependency(m_r->getGBuffer().getColorRt(1), TextureUsageBit::ALL_FRAMEBUFFER_ATTACHMENT));
  54. rpass.newDependency(RenderPassDependency(m_r->getGBuffer().getDepthRt(), TextureUsageBit::SAMPLED_FRAGMENT,
  55. TextureSubresourceInfo(DepthStencilAspectBit::DEPTH)));
  56. rpass.newDependency(
  57. RenderPassDependency(ctx.m_clusteredShading.m_clustersBufferHandle, BufferUsageBit::STORAGE_FRAGMENT_READ));
  58. }
  59. void GBufferPost::run(const RenderingContext& ctx, RenderPassWorkContext& rgraphCtx)
  60. {
  61. const ClusteredShadingContext& rsrc = ctx.m_clusteredShading;
  62. CommandBufferPtr& cmdb = rgraphCtx.m_commandBuffer;
  63. cmdb->setViewport(0, 0, m_r->getInternalResolution().x(), m_r->getInternalResolution().y());
  64. cmdb->bindShaderProgram(m_grProg);
  65. cmdb->setBlendFactors(0, BlendFactor::ONE, BlendFactor::SRC_ALPHA, BlendFactor::ZERO, BlendFactor::ONE);
  66. cmdb->setBlendFactors(1, BlendFactor::ONE, BlendFactor::SRC_ALPHA, BlendFactor::ZERO, BlendFactor::ONE);
  67. // Bind all
  68. cmdb->bindSampler(0, 0, m_r->getSamplers().m_nearestNearestClamp);
  69. rgraphCtx.bindTexture(0, 1, m_r->getGBuffer().getDepthRt(), TextureSubresourceInfo(DepthStencilAspectBit::DEPTH));
  70. cmdb->bindSampler(0, 2, m_r->getSamplers().m_trilinearRepeat);
  71. bindUniforms(cmdb, 0, 3, rsrc.m_clusteredShadingUniformsToken);
  72. bindUniforms(cmdb, 0, 4, rsrc.m_decalsToken);
  73. cmdb->bindTexture(0, 5,
  74. (rsrc.m_diffuseDecalTextureView) ? rsrc.m_diffuseDecalTextureView : m_r->getDummyTextureView2d());
  75. cmdb->bindTexture(0, 6,
  76. (rsrc.m_specularRoughnessDecalTextureView) ? rsrc.m_specularRoughnessDecalTextureView
  77. : m_r->getDummyTextureView2d());
  78. bindStorage(cmdb, 0, 7, rsrc.m_clustersToken);
  79. // Draw
  80. cmdb->drawArrays(PrimitiveTopology::TRIANGLES, 3);
  81. // Restore state
  82. cmdb->setBlendFactors(0, BlendFactor::ONE, BlendFactor::ZERO);
  83. cmdb->setBlendFactors(1, BlendFactor::ONE, BlendFactor::ZERO);
  84. }
  85. } // end namespace anki