MotionVectors.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  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/MotionVectors.h>
  6. #include <AnKi/Renderer/Renderer.h>
  7. #include <AnKi/Renderer/GBuffer.h>
  8. #include <AnKi/Core/CVarSet.h>
  9. #include <AnKi/Util/Tracer.h>
  10. #include <AnKi/Window/Input.h>
  11. namespace anki {
  12. Error MotionVectors::init()
  13. {
  14. const Error err = initInternal();
  15. if(err)
  16. {
  17. ANKI_R_LOGE("Failed to initialize motion vectors");
  18. }
  19. return err;
  20. }
  21. Error MotionVectors::initInternal()
  22. {
  23. ANKI_R_LOGV("Initializing motion vectors");
  24. // Prog
  25. ANKI_CHECK(loadShaderProgram("ShaderBinaries/MotionVectors.ankiprogbin", m_prog, m_grProg));
  26. // RTs
  27. m_motionVectorsRtDescr = getRenderer().create2DRenderTargetDescription(
  28. getRenderer().getInternalResolution().x(), getRenderer().getInternalResolution().y(), Format::kR16G16_Sfloat, "MotionVectors");
  29. m_motionVectorsRtDescr.bake();
  30. return Error::kNone;
  31. }
  32. void MotionVectors::populateRenderGraph(RenderingContext& ctx)
  33. {
  34. ANKI_TRACE_SCOPED_EVENT(MotionVectors);
  35. RenderGraphBuilder& rgraph = ctx.m_renderGraphDescr;
  36. m_runCtx.m_motionVectorsRtHandle = rgraph.newRenderTarget(m_motionVectorsRtDescr);
  37. RenderPassBase* ppass;
  38. TextureUsageBit readUsage;
  39. TextureUsageBit writeUsage;
  40. if(g_preferComputeCVar.get())
  41. {
  42. NonGraphicsRenderPass& pass = rgraph.newNonGraphicsRenderPass("MotionVectors");
  43. readUsage = TextureUsageBit::kSampledCompute;
  44. writeUsage = TextureUsageBit::kStorageComputeWrite;
  45. ppass = &pass;
  46. }
  47. else
  48. {
  49. GraphicsRenderPass& pass = rgraph.newGraphicsRenderPass("MotionVectors");
  50. pass.setRenderpassInfo({GraphicsRenderPassTargetDesc(m_runCtx.m_motionVectorsRtHandle)});
  51. readUsage = TextureUsageBit::kSampledFragment;
  52. writeUsage = TextureUsageBit::kFramebufferWrite;
  53. ppass = &pass;
  54. }
  55. ppass->setWork([this, &ctx](RenderPassWorkContext& rgraphCtx) -> void {
  56. ANKI_TRACE_SCOPED_EVENT(MotionVectors);
  57. CommandBuffer& cmdb = *rgraphCtx.m_commandBuffer;
  58. cmdb.bindShaderProgram(m_grProg.get());
  59. cmdb.bindSampler(ANKI_REG(s0), getRenderer().getSamplers().m_nearestNearestClamp.get());
  60. rgraphCtx.bindTexture(ANKI_REG(t0), getRenderer().getGBuffer().getDepthRt());
  61. rgraphCtx.bindTexture(ANKI_REG(t1), getRenderer().getGBuffer().getColorRt(3));
  62. class Uniforms
  63. {
  64. public:
  65. Mat4 m_currentViewProjMat;
  66. Mat4 m_currentInvViewProjMat;
  67. Mat4 m_prevViewProjMat;
  68. } * pc;
  69. pc = allocateAndBindConstants<Uniforms>(cmdb, ANKI_REG(b0));
  70. pc->m_currentViewProjMat = ctx.m_matrices.m_viewProjection;
  71. pc->m_currentInvViewProjMat = ctx.m_matrices.m_invertedViewProjection;
  72. pc->m_prevViewProjMat = ctx.m_prevMatrices.m_viewProjection;
  73. if(g_preferComputeCVar.get())
  74. {
  75. rgraphCtx.bindTexture(ANKI_REG(u0), m_runCtx.m_motionVectorsRtHandle);
  76. }
  77. if(g_preferComputeCVar.get())
  78. {
  79. dispatchPPCompute(cmdb, 8, 8, getRenderer().getInternalResolution().x(), getRenderer().getInternalResolution().y());
  80. }
  81. else
  82. {
  83. cmdb.setViewport(0, 0, getRenderer().getInternalResolution().x(), getRenderer().getInternalResolution().y());
  84. cmdb.draw(PrimitiveTopology::kTriangles, 3);
  85. }
  86. });
  87. ppass->newTextureDependency(m_runCtx.m_motionVectorsRtHandle, writeUsage);
  88. ppass->newTextureDependency(getRenderer().getGBuffer().getColorRt(3), readUsage);
  89. ppass->newTextureDependency(getRenderer().getGBuffer().getDepthRt(), readUsage);
  90. ppass->newTextureDependency(getRenderer().getGBuffer().getPreviousFrameDepthRt(), readUsage);
  91. }
  92. } // end namespace anki