Tonemapping.cpp 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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/Tonemapping.h>
  6. #include <AnKi/Renderer/DownscaleBlur.h>
  7. #include <AnKi/Renderer/Renderer.h>
  8. #include <AnKi/Util/Tracer.h>
  9. namespace anki {
  10. Error Tonemapping::init()
  11. {
  12. const Error err = initInternal();
  13. if(err)
  14. {
  15. ANKI_R_LOGE("Failed to initialize tonemapping");
  16. }
  17. return err;
  18. }
  19. Error Tonemapping::initInternal()
  20. {
  21. m_inputTexMip = getRenderer().getDownscaleBlur().getMipmapCount() - 2;
  22. const U32 width = getRenderer().getDownscaleBlur().getPassWidth(m_inputTexMip);
  23. const U32 height = getRenderer().getDownscaleBlur().getPassHeight(m_inputTexMip);
  24. ANKI_R_LOGV("Initializing tonemapping. Resolution %ux%u", width, height);
  25. // Create program
  26. ANKI_CHECK(loadShaderProgram("ShaderBinaries/TonemappingAverageLuminance.ankiprogbin", m_prog, m_grProg));
  27. // Create exposure texture.
  28. // WARNING: Use it only as IMAGE and nothing else. It will not be tracked by the rendergraph. No tracking means no automatic image transitions
  29. const TextureUsageBit usage = TextureUsageBit::kAllStorage;
  30. const TextureInitInfo texinit = getRenderer().create2DRenderTargetInitInfo(1, 1, Format::kR16G16_Sfloat, usage, "ExposureAndAvgLum1x1");
  31. ClearValue clearValue;
  32. clearValue.m_colorf = {0.5f, 0.5f, 0.5f, 0.5f};
  33. m_exposureAndAvgLuminance1x1 = getRenderer().createAndClearRenderTarget(texinit, TextureUsageBit::kAllStorage, clearValue);
  34. return Error::kNone;
  35. }
  36. void Tonemapping::importRenderTargets(RenderingContext& ctx)
  37. {
  38. // Just import it. It will not be used in resource tracking
  39. m_runCtx.m_exposureLuminanceHandle = ctx.m_renderGraphDescr.importRenderTarget(m_exposureAndAvgLuminance1x1.get(), TextureUsageBit::kAllStorage);
  40. }
  41. void Tonemapping::populateRenderGraph(RenderingContext& ctx)
  42. {
  43. ANKI_TRACE_SCOPED_EVENT(Tonemapping);
  44. RenderGraphDescription& rgraph = ctx.m_renderGraphDescr;
  45. // Create the pass
  46. ComputeRenderPassDescription& pass = rgraph.newComputeRenderPass("AvgLuminance");
  47. pass.setWork([this](RenderPassWorkContext& rgraphCtx) {
  48. ANKI_TRACE_SCOPED_EVENT(Tonemapping);
  49. CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
  50. cmdb.bindShaderProgram(m_grProg.get());
  51. rgraphCtx.bindStorageTexture(0, 1, m_runCtx.m_exposureLuminanceHandle);
  52. TextureSubresourceInfo inputTexSubresource;
  53. inputTexSubresource.m_firstMipmap = m_inputTexMip;
  54. rgraphCtx.bindTexture(0, 0, getRenderer().getDownscaleBlur().getRt(), inputTexSubresource);
  55. cmdb.dispatchCompute(1, 1, 1);
  56. });
  57. TextureSubresourceInfo inputTexSubresource;
  58. inputTexSubresource.m_firstMipmap = m_inputTexMip;
  59. pass.newTextureDependency(getRenderer().getDownscaleBlur().getRt(), TextureUsageBit::kSampledCompute, inputTexSubresource);
  60. }
  61. } // end namespace anki