Bs.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. #include "Renderer.h"
  2. #include "App.h"
  3. #include "Scene.h"
  4. #include "MeshNode.h"
  5. //======================================================================================================================
  6. // createFbo =
  7. //======================================================================================================================
  8. void Renderer::Bs::createFbo()
  9. {
  10. fbo.create();
  11. fbo.bind();
  12. fbo.setNumOfColorAttachements(1);
  13. glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, r.pps.prePassFai.getGlId(), 0);
  14. glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, r.ms.depthFai.getGlId(), 0);
  15. if(!fbo.isGood())
  16. FATAL("Cannot create deferred shading blending stage FBO");
  17. fbo.unbind();
  18. }
  19. //======================================================================================================================
  20. // createRefractFbo =
  21. //======================================================================================================================
  22. void Renderer::Bs::createRefractFbo()
  23. {
  24. refractFbo.create();
  25. refractFbo.bind();
  26. refractFbo.setNumOfColorAttachements(1);
  27. glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, refractFai.getGlId(), 0);
  28. glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, r.ms.depthFai.getGlId(), 0);
  29. if(!refractFbo.isGood())
  30. FATAL("Cannot create deferred shading blending stage FBO");
  31. refractFbo.unbind();
  32. }
  33. //======================================================================================================================
  34. // init =
  35. //======================================================================================================================
  36. void Renderer::Bs::init()
  37. {
  38. createFbo();
  39. refractFai.createEmpty2D(r.width, r.height, GL_RGBA8, GL_RGBA, GL_FLOAT, false);
  40. createRefractFbo();
  41. refractSProg = Resource::shaders.load("shaders/BsRefract.glsl");
  42. }
  43. //======================================================================================================================
  44. // run =
  45. //======================================================================================================================
  46. void Renderer::Bs::run()
  47. {
  48. Renderer::setViewport(0, 0, r.width, r.height);
  49. glDepthMask(false);
  50. // render the meshes
  51. for(Vec<MeshNode*>::iterator it=app->getScene()->meshNodes.begin(); it!=app->getScene()->meshNodes.end(); it++)
  52. {
  53. MeshNode* meshNode = (*it);
  54. DEBUG_ERR(meshNode->material == NULL);
  55. if(!meshNode->material->blends) continue;
  56. // refracts
  57. if(meshNode->material->stdUniVars[Material::SUV_PPS_PRE_PASS_FAI])
  58. {
  59. // render to the temp FAI
  60. refractFbo.bind();
  61. glEnable(GL_STENCIL_TEST);
  62. glClear(GL_STENCIL_BUFFER_BIT);
  63. glStencilFunc(GL_ALWAYS, 0x1, 0x1);
  64. glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
  65. r.setupMaterial(*meshNode->material, *meshNode, *r.cam);
  66. glDisable(GL_BLEND); // a hack
  67. meshNode->render();
  68. // render the temp FAI to prePassFai
  69. fbo.bind();
  70. glStencilFunc(GL_EQUAL, 0x1, 0x1);
  71. glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
  72. if(meshNode->material->blends)
  73. {
  74. glEnable(GL_BLEND);
  75. glBlendFunc(meshNode->material->blendingSfactor, meshNode->material->blendingDfactor);
  76. }
  77. else
  78. glDisable(GL_BLEND);
  79. refractSProg->bind();
  80. refractSProg->findUniVar("fai")->setTexture(refractFai, 0);
  81. Renderer::drawQuad(0);
  82. // cleanup
  83. glDisable(GL_STENCIL_TEST);
  84. }
  85. else
  86. {
  87. fbo.bind();
  88. r.setupMaterial(*meshNode->material, *meshNode, *r.cam);
  89. meshNode->render();
  90. }
  91. }
  92. glDepthMask(true);
  93. glPolygonMode(GL_FRONT, GL_FILL); // the rendering above fucks the polygon mode
  94. Fbo::unbind();
  95. }