FinalComposite.cpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. // Copyright (C) 2009-2017, 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/FinalComposite.h>
  6. #include <anki/renderer/Renderer.h>
  7. #include <anki/renderer/Bloom.h>
  8. #include <anki/renderer/TemporalAA.h>
  9. #include <anki/renderer/Tonemapping.h>
  10. #include <anki/renderer/LightShading.h>
  11. #include <anki/renderer/GBuffer.h>
  12. #include <anki/renderer/Dbg.h>
  13. #include <anki/renderer/Ssao.h>
  14. #include <anki/renderer/DownscaleBlur.h>
  15. #include <anki/util/Logger.h>
  16. #include <anki/misc/ConfigSet.h>
  17. namespace anki
  18. {
  19. const PixelFormat FinalComposite::RT_PIXEL_FORMAT(ComponentFormat::R8G8B8, TransformFormat::UNORM);
  20. FinalComposite::FinalComposite(Renderer* r)
  21. : RendererObject(r)
  22. {
  23. }
  24. FinalComposite::~FinalComposite()
  25. {
  26. }
  27. Error FinalComposite::initInternal(const ConfigSet& config)
  28. {
  29. ANKI_ASSERT("Initializing PPS");
  30. ANKI_CHECK(loadColorGradingTexture("engine_data/DefaultLut.ankitex"));
  31. m_sharpenEnabled = config.getNumber("r.finalComposite.sharpen");
  32. if(!m_r->getDrawToDefaultFramebuffer())
  33. {
  34. m_rt = m_r->createAndClearRenderTarget(m_r->create2DRenderTargetInitInfo(m_r->getWidth(),
  35. m_r->getHeight(),
  36. RT_PIXEL_FORMAT,
  37. TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE | TextureUsageBit::SAMPLED_FRAGMENT,
  38. SamplingFilter::LINEAR,
  39. 1,
  40. "pps"));
  41. FramebufferInitInfo fbInit("pps");
  42. fbInit.m_colorAttachmentCount = 1;
  43. fbInit.m_colorAttachments[0].m_texture = m_rt;
  44. fbInit.m_colorAttachments[0].m_loadOperation = AttachmentLoadOperation::DONT_CARE;
  45. m_fb = getGrManager().newInstance<Framebuffer>(fbInit);
  46. }
  47. ANKI_CHECK(getResourceManager().loadResource("engine_data/BlueNoiseLdrRgb64x64.ankitex", m_blueNoise));
  48. // Progs
  49. ANKI_CHECK(getResourceManager().loadResource("programs/FinalComposite.ankiprog", m_prog));
  50. ShaderProgramResourceMutationInitList<4> mutations(m_prog);
  51. mutations.add("BLUE_NOISE", 1)
  52. .add("SHARPEN_ENABLED", m_sharpenEnabled)
  53. .add("BLOOM_ENABLED", 1)
  54. .add("DBG_ENABLED", 0);
  55. ShaderProgramResourceConstantValueInitList<2> consts(m_prog);
  56. consts.add("LUT_SIZE", U32(LUT_SIZE)).add("FB_SIZE", UVec2(m_r->getWidth(), m_r->getHeight()));
  57. const ShaderProgramResourceVariant* variant;
  58. m_prog->getOrCreateVariant(mutations.get(), consts.get(), variant);
  59. m_grProgs[0] = variant->getProgram();
  60. mutations[3].m_value = 1;
  61. m_prog->getOrCreateVariant(mutations.get(), consts.get(), variant);
  62. m_grProgs[1] = variant->getProgram();
  63. return Error::NONE;
  64. }
  65. Error FinalComposite::init(const ConfigSet& config)
  66. {
  67. Error err = initInternal(config);
  68. if(err)
  69. {
  70. ANKI_R_LOGE("Failed to init PPS");
  71. }
  72. return err;
  73. }
  74. Error FinalComposite::loadColorGradingTexture(CString filename)
  75. {
  76. m_lut.reset(nullptr);
  77. ANKI_CHECK(getResourceManager().loadResource(filename, m_lut));
  78. ANKI_ASSERT(m_lut->getWidth() == LUT_SIZE);
  79. ANKI_ASSERT(m_lut->getHeight() == LUT_SIZE);
  80. ANKI_ASSERT(m_lut->getDepth() == LUT_SIZE);
  81. return Error::NONE;
  82. }
  83. Error FinalComposite::run(RenderingContext& ctx)
  84. {
  85. ANKI_ASSERT(!"TODO");
  86. #if 0
  87. // Get the drawing parameters
  88. const Bool drawToDefaultFb = ctx.m_outFb.isCreated();
  89. const Bool dbgEnabled = m_r->getDbg().getEnabled();
  90. CommandBufferPtr cmdb;
  91. if(drawToDefaultFb)
  92. {
  93. cmdb = ctx.m_defaultFbCommandBuffer;
  94. }
  95. else
  96. {
  97. cmdb = ctx.m_commandBuffer;
  98. }
  99. // Bind stuff
  100. cmdb->informTextureCurrentUsage(m_r->getTemporalAA().getRt(), TextureUsageBit::SAMPLED_FRAGMENT);
  101. cmdb->informTextureCurrentUsage(m_r->getBloom().m_upscale.m_rt, TextureUsageBit::SAMPLED_FRAGMENT);
  102. cmdb->bindTextureAndSampler(
  103. 0, 0, m_r->getTemporalAA().getRt(), (drawToDefaultFb) ? m_r->getNearestSampler() : m_r->getLinearSampler());
  104. cmdb->bindTexture(0, 1, m_r->getBloom().m_upscale.m_rt);
  105. cmdb->bindTexture(0, 2, m_lut->getGrTexture());
  106. cmdb->bindTexture(0, 3, m_blueNoise->getGrTexture());
  107. if(dbgEnabled)
  108. {
  109. cmdb->bindTexture(0, 5, m_r->getDbg().getRt());
  110. }
  111. cmdb->bindStorageBuffer(0, 0, m_r->getTonemapping().m_luminanceBuff, 0, MAX_PTR_SIZE);
  112. Vec4* uniforms = allocateAndBindUniforms<Vec4*>(sizeof(Vec4), cmdb, 0, 0);
  113. uniforms->x() = F32(m_r->getFrameCount() % m_blueNoise->getLayerCount());
  114. // Get or create FB
  115. FramebufferPtr* fb = nullptr;
  116. U width, height;
  117. if(drawToDefaultFb)
  118. {
  119. fb = &ctx.m_outFb;
  120. width = ctx.m_outFbWidth;
  121. height = ctx.m_outFbHeight;
  122. }
  123. else
  124. {
  125. width = m_r->getWidth();
  126. height = m_r->getHeight();
  127. fb = &m_fb;
  128. }
  129. cmdb->beginRenderPass(*fb);
  130. cmdb->setViewport(0, 0, width, height);
  131. cmdb->bindShaderProgram(m_grProgs[dbgEnabled]);
  132. m_r->drawQuad(cmdb);
  133. cmdb->endRenderPass();
  134. if(!drawToDefaultFb)
  135. {
  136. cmdb->setTextureSurfaceBarrier(m_rt,
  137. TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE,
  138. TextureUsageBit::SAMPLED_FRAGMENT,
  139. TextureSurfaceInfo(0, 0, 0, 0));
  140. }
  141. #endif
  142. return Error::NONE;
  143. }
  144. } // end namespace anki