Upsample.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  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. rcInit.m_textures[0].m_usage = TextureUsageBit::SAMPLED_FRAGMENT
  24. | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ;
  25. sinit.m_minLod = 1.0;
  26. sinit.m_mipmapFilter = SamplingFilter::NEAREST;
  27. rcInit.m_textures[1].m_texture = m_r->getMs().getDepthRt();
  28. rcInit.m_textures[1].m_sampler = gr.newInstance<Sampler>(sinit);
  29. rcInit.m_textures[1].m_usage = TextureUsageBit::SAMPLED_FRAGMENT
  30. | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ;
  31. sinit.m_minLod = 0.0;
  32. rcInit.m_textures[2].m_texture = m_r->getFs().getRt();
  33. rcInit.m_textures[2].m_sampler = gr.newInstance<Sampler>(sinit);
  34. sinit.m_minMagFilter = SamplingFilter::LINEAR;
  35. rcInit.m_textures[3].m_texture = m_r->getFs().getRt();
  36. rcInit.m_textures[3].m_sampler = gr.newInstance<Sampler>(sinit);
  37. rcInit.m_textures[4].m_texture = m_r->getSsao().getRt();
  38. rcInit.m_uniformBuffers[0].m_uploadedMemory = true;
  39. rcInit.m_uniformBuffers[0].m_usage = BufferUsageBit::UNIFORM_FRAGMENT;
  40. m_rcGroup = getGrManager().newInstance<ResourceGroup>(rcInit);
  41. // Shader
  42. StringAuto pps(getFrameAllocator());
  43. pps.sprintf("#define TEXTURE_WIDTH %uu\n"
  44. "#define TEXTURE_HEIGHT %uu\n"
  45. "#define SSAO_ENABLED %u\n",
  46. m_r->getWidth() / FS_FRACTION,
  47. m_r->getHeight() / FS_FRACTION,
  48. 1);
  49. ANKI_CHECK(getResourceManager().loadResourceToCache(
  50. m_frag, "shaders/NearDepthUpscale.frag.glsl", pps.toCString(), "r_"));
  51. ANKI_CHECK(getResourceManager().loadResourceToCache(
  52. m_vert, "shaders/NearDepthUpscale.vert.glsl", pps.toCString(), "r_"));
  53. // Ppline
  54. PipelineInitInfo ppinit;
  55. ppinit.m_depthStencil.m_depthWriteEnabled = false;
  56. ppinit.m_depthStencil.m_depthCompareFunction = CompareOperation::ALWAYS;
  57. ppinit.m_color.m_attachmentCount = 1;
  58. ppinit.m_color.m_attachments[0].m_format = IS_COLOR_ATTACHMENT_PIXEL_FORMAT;
  59. ppinit.m_color.m_attachments[0].m_srcBlendMethod = BlendMethod::ONE;
  60. ppinit.m_color.m_attachments[0].m_dstBlendMethod = BlendMethod::SRC_ALPHA;
  61. ppinit.m_shaders[U(ShaderType::VERTEX)] = m_vert->getGrShader();
  62. ppinit.m_shaders[U(ShaderType::FRAGMENT)] = m_frag->getGrShader();
  63. m_ppline = gr.newInstance<Pipeline>(ppinit);
  64. // Create FB
  65. FramebufferInitInfo fbInit;
  66. fbInit.m_colorAttachmentCount = 1;
  67. fbInit.m_colorAttachments[0].m_texture = m_r->getIs().getRt();
  68. fbInit.m_colorAttachments[0].m_loadOperation =
  69. AttachmentLoadOperation::LOAD;
  70. fbInit.m_colorAttachments[0].m_usageInsideRenderPass =
  71. TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE;
  72. m_fb = getGrManager().newInstance<Framebuffer>(fbInit);
  73. return ErrorCode::NONE;
  74. }
  75. //==============================================================================
  76. void Upsample::run(RenderingContext& ctx)
  77. {
  78. CommandBufferPtr cmdb = ctx.m_commandBuffer;
  79. TransientMemoryInfo dyn;
  80. Vec4* linearDepth = static_cast<Vec4*>(
  81. getGrManager().allocateFrameTransientMemory(sizeof(Vec4),
  82. BufferUsageBit::UNIFORM_ALL,
  83. dyn.m_uniformBuffers[0]));
  84. const Frustum& fr = ctx.m_frustumComponent->getFrustum();
  85. computeLinearizeDepthOptimal(
  86. fr.getNear(), fr.getFar(), linearDepth->x(), linearDepth->y());
  87. cmdb->beginRenderPass(m_fb);
  88. cmdb->bindPipeline(m_ppline);
  89. cmdb->setViewport(0, 0, m_r->getWidth(), m_r->getHeight());
  90. cmdb->bindResourceGroup(m_rcGroup, 0, &dyn);
  91. m_r->drawQuad(cmdb);
  92. cmdb->endRenderPass();
  93. }
  94. } // end namespace anki