RenderingPass.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. // Copyright (C) 2014, Panagiotis Christopoulos Charitos.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #include "anki/renderer/RenderingPass.h"
  6. #include "anki/renderer/Renderer.h"
  7. #include "anki/util/Enum.h"
  8. namespace anki {
  9. //==============================================================================
  10. Timestamp RenderingPass::getGlobalTimestamp() const
  11. {
  12. return m_r->getGlobalTimestamp();
  13. }
  14. //==============================================================================
  15. GlDevice& RenderingPass::getGlDevice()
  16. {
  17. return m_r->_getGlDevice();
  18. }
  19. //==============================================================================
  20. const GlDevice& RenderingPass::getGlDevice() const
  21. {
  22. return m_r->_getGlDevice();
  23. }
  24. //==============================================================================
  25. HeapAllocator<U8>& RenderingPass::getAllocator()
  26. {
  27. return m_r->_getAllocator();
  28. }
  29. //==============================================================================
  30. ResourceManager& RenderingPass::getResourceManager()
  31. {
  32. return m_r->_getResourceManager();
  33. }
  34. //==============================================================================
  35. Error BlurringRenderingPass::initBlurring(
  36. Renderer& r, U width, U height, U samples, F32 blurringDistance)
  37. {
  38. Error err = ErrorCode::NONE;
  39. GlDevice& gl = getGlDevice();
  40. GlCommandBufferHandle cmdb;
  41. err = cmdb.create(&gl);
  42. if(err) return err;
  43. Array<String, 2> pps;
  44. String::ScopeDestroyer ppsd0(&pps[0], getAllocator());
  45. String::ScopeDestroyer ppsd1(&pps[1], getAllocator());
  46. err = pps[1].sprintf(getAllocator(),
  47. "#define HPASS\n"
  48. "#define COL_RGB\n"
  49. "#define BLURRING_DIST float(%f)\n"
  50. "#define IMG_DIMENSION %u\n"
  51. "#define SAMPLES %u\n",
  52. blurringDistance, height, samples);
  53. if(err) return err;
  54. err = pps[0].sprintf(getAllocator(),
  55. "#define VPASS\n"
  56. "#define COL_RGB\n"
  57. "#define BLURRING_DIST float(%f)\n"
  58. "#define IMG_DIMENSION %u\n"
  59. "#define SAMPLES %u\n",
  60. blurringDistance, width, samples);
  61. if(err) return err;
  62. for(U i = 0; i < 2; i++)
  63. {
  64. Direction& dir = m_dirs[i];
  65. err = r.createRenderTarget(width, height, GL_RGB8, 1, dir.m_rt);
  66. if(err) return err;
  67. // Set to bilinear because the blurring techniques take advantage of
  68. // that
  69. dir.m_rt.setFilter(cmdb, GlTextureHandle::Filter::LINEAR);
  70. // Create FB
  71. err = dir.m_fb.create(
  72. cmdb, {{dir.m_rt, GL_COLOR_ATTACHMENT0}});
  73. if(err) return err;
  74. err = dir.m_frag.loadToCache(&getResourceManager(),
  75. "shaders/VariableSamplingBlurGeneric.frag.glsl",
  76. pps[i].toCString(), "r_");
  77. if(err) return err;
  78. err = r.createDrawQuadPipeline(
  79. dir.m_frag->getGlProgram(), dir.m_ppline);
  80. if(err) return err;
  81. }
  82. cmdb.finish();
  83. return err;
  84. }
  85. //==============================================================================
  86. Error BlurringRenderingPass::runBlurring(
  87. Renderer& r, GlCommandBufferHandle& cmdb)
  88. {
  89. // H pass input
  90. m_dirs[enumToValue(DirectionEnum::VERTICAL)].m_rt.bind(cmdb, 1);
  91. // V pass input
  92. m_dirs[enumToValue(DirectionEnum::HORIZONTAL)].m_rt.bind(cmdb, 0);
  93. for(U32 i = 0; i < m_blurringIterationsCount; i++)
  94. {
  95. // hpass
  96. m_dirs[enumToValue(DirectionEnum::HORIZONTAL)].m_fb.bind(cmdb, true);
  97. m_dirs[enumToValue(DirectionEnum::HORIZONTAL)].m_ppline.bind(cmdb);
  98. r.drawQuad(cmdb);
  99. // vpass
  100. m_dirs[enumToValue(DirectionEnum::VERTICAL)].m_fb.bind(cmdb, true);
  101. m_dirs[enumToValue(DirectionEnum::VERTICAL)].m_ppline.bind(cmdb);
  102. r.drawQuad(cmdb);
  103. }
  104. return ErrorCode::NONE;
  105. }
  106. } // end namespace anki