Upsample.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. // Copyright (C) 2009-2016, 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/Upsample.h>
  6. #include <anki/renderer/Renderer.h>
  7. #include <anki/renderer/Ms.h>
  8. #include <anki/renderer/Is.h>
  9. #include <anki/renderer/Fs.h>
  10. #include <anki/renderer/Ssao.h>
  11. #include <anki/scene/FrustumComponent.h>
  12. namespace anki
  13. {
  14. //==============================================================================
  15. Error Upsample::init(const ConfigSet& config)
  16. {
  17. GrManager& gr = getGrManager();
  18. // Create RC group
  19. ResourceGroupInitInfo rcInit;
  20. SamplerInitInfo sinit;
  21. sinit.m_repeat = false;
  22. rcInit.m_textures[0].m_texture = m_r->getMs().getDepthRt();
  23. sinit.m_minLod = 1.0;
  24. sinit.m_mipmapFilter = SamplingFilter::NEAREST;
  25. rcInit.m_textures[1].m_texture = m_r->getMs().getDepthRt();
  26. rcInit.m_textures[1].m_sampler = gr.newInstance<Sampler>(sinit);
  27. sinit.m_minLod = 0.0;
  28. rcInit.m_textures[2].m_texture = m_r->getFs().getRt();
  29. rcInit.m_textures[2].m_sampler = gr.newInstance<Sampler>(sinit);
  30. sinit.m_minMagFilter = SamplingFilter::LINEAR;
  31. rcInit.m_textures[3].m_texture = m_r->getFs().getRt();
  32. rcInit.m_textures[3].m_sampler = gr.newInstance<Sampler>(sinit);
  33. if(m_r->getSsaoEnabled())
  34. {
  35. rcInit.m_textures[4].m_texture = m_r->getSsao().getRt();
  36. }
  37. rcInit.m_uniformBuffers[0].m_dynamic = true;
  38. m_rcGroup = getGrManager().newInstance<ResourceGroup>(rcInit);
  39. // Shader
  40. StringAuto pps(getFrameAllocator());
  41. pps.sprintf("#define TEXTURE_WIDTH %uu\n"
  42. "#define TEXTURE_HEIGHT %uu\n"
  43. "#define SSAO_ENABLED %u\n",
  44. m_r->getWidth() / FS_FRACTION,
  45. m_r->getHeight() / FS_FRACTION,
  46. m_r->getSsaoEnabled());
  47. ANKI_CHECK(getResourceManager().loadResourceToCache(
  48. m_frag, "shaders/NearDepthUpscale.frag.glsl", pps.toCString(), "r_"));
  49. ANKI_CHECK(getResourceManager().loadResourceToCache(
  50. m_vert, "shaders/NearDepthUpscale.vert.glsl", pps.toCString(), "r_"));
  51. // Ppline
  52. PipelineInitInfo ppinit;
  53. ppinit.m_depthStencil.m_depthWriteEnabled = false;
  54. ppinit.m_depthStencil.m_depthCompareFunction = CompareOperation::ALWAYS;
  55. ppinit.m_color.m_attachmentCount = 1;
  56. ppinit.m_color.m_attachments[0].m_format = Is::RT_PIXEL_FORMAT;
  57. ppinit.m_color.m_attachments[0].m_srcBlendMethod = BlendMethod::ONE;
  58. ppinit.m_color.m_attachments[0].m_dstBlendMethod = BlendMethod::SRC_ALPHA;
  59. ppinit.m_shaders[U(ShaderType::VERTEX)] = m_vert->getGrShader();
  60. ppinit.m_shaders[U(ShaderType::FRAGMENT)] = m_frag->getGrShader();
  61. m_ppline = gr.newInstance<Pipeline>(ppinit);
  62. // Create FB
  63. FramebufferInitInfo fbInit;
  64. fbInit.m_colorAttachmentCount = 1;
  65. fbInit.m_colorAttachments[0].m_texture = m_r->getIs().getRt();
  66. fbInit.m_colorAttachments[0].m_loadOperation =
  67. AttachmentLoadOperation::LOAD;
  68. m_fb = getGrManager().newInstance<Framebuffer>(fbInit);
  69. return ErrorCode::NONE;
  70. }
  71. //==============================================================================
  72. void Upsample::run(RenderingContext& ctx)
  73. {
  74. CommandBufferPtr cmdb = ctx.m_commandBuffer;
  75. DynamicBufferInfo dyn;
  76. Vec4* linearDepth =
  77. static_cast<Vec4*>(getGrManager().allocateFrameHostVisibleMemory(
  78. sizeof(Vec4), BufferUsage::UNIFORM, dyn.m_uniformBuffers[0]));
  79. const Frustum& fr = ctx.m_frustumComponent->getFrustum();
  80. computeLinearizeDepthOptimal(
  81. fr.getNear(), fr.getFar(), linearDepth->x(), linearDepth->y());
  82. cmdb->beginRenderPass(m_fb);
  83. cmdb->bindPipeline(m_ppline);
  84. cmdb->setViewport(0, 0, m_r->getWidth(), m_r->getHeight());
  85. cmdb->bindResourceGroup(m_rcGroup, 0, &dyn);
  86. m_r->drawQuad(cmdb);
  87. cmdb->endRenderPass();
  88. }
  89. } // end namespace anki