Bs.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. #include "Bs.h"
  2. #include "Renderer.h"
  3. #include "App.h"
  4. #include "Scene.h"
  5. #include "MeshNode.h"
  6. #include "ShaderProg.h"
  7. //======================================================================================================================
  8. // createFbo =
  9. //======================================================================================================================
  10. void Bs::createFbo()
  11. {
  12. try
  13. {
  14. fbo.create();
  15. fbo.bind();
  16. fbo.setNumOfColorAttachements(1);
  17. glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, r.pps.prePassFai.getGlId(), 0);
  18. glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, r.ms.depthFai.getGlId(), 0);
  19. fbo.checkIfGood();
  20. fbo.unbind();
  21. }
  22. catch(std::exception& e)
  23. {
  24. throw EXCEPTION("Failed to create blending stage FBO");
  25. }
  26. }
  27. //======================================================================================================================
  28. // createRefractFbo =
  29. //======================================================================================================================
  30. void Bs::createRefractFbo()
  31. {
  32. try
  33. {
  34. refractFbo.create();
  35. refractFbo.bind();
  36. refractFbo.setNumOfColorAttachements(1);
  37. glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, refractFai.getGlId(), 0);
  38. glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, r.ms.depthFai.getGlId(), 0);
  39. refractFbo.checkIfGood();
  40. refractFbo.unbind();
  41. }
  42. catch(std::exception& e)
  43. {
  44. throw EXCEPTION("Failed to create blending stage refract FBO");
  45. }
  46. }
  47. //======================================================================================================================
  48. // init =
  49. //======================================================================================================================
  50. void Bs::init(const RendererInitializer& /*initializer*/)
  51. {
  52. createFbo();
  53. refractFai.createEmpty2D(r.getWidth(), r.getHeight(), GL_RGBA8, GL_RGBA, GL_FLOAT);
  54. createRefractFbo();
  55. refractSProg.loadRsrc("shaders/BsRefract.glsl");
  56. }
  57. //======================================================================================================================
  58. // run =
  59. //======================================================================================================================
  60. void Bs::run()
  61. {
  62. Renderer::setViewport(0, 0, r.getWidth(), r.getHeight());
  63. glDepthMask(false);
  64. // render the meshes
  65. for(Vec<MeshNode*>::iterator it=app->getScene().meshNodes.begin(); it!=app->getScene().meshNodes.end(); it++)
  66. {
  67. MeshNode* meshNode = (*it);
  68. if(meshNode->mesh->material.get() == NULL)
  69. {
  70. throw EXCEPTION("Mesh \"" + meshNode->mesh->getRsrcName() + "\" doesnt have material" );
  71. }
  72. if(!meshNode->mesh->material->blends)
  73. {
  74. continue;
  75. }
  76. // refracts
  77. if(meshNode->mesh->material->stdUniVars[Material::SUV_PPS_PRE_PASS_FAI])
  78. {
  79. // render to the temp FAI
  80. refractFbo.bind();
  81. glEnable(GL_STENCIL_TEST);
  82. glClear(GL_STENCIL_BUFFER_BIT);
  83. glStencilFunc(GL_ALWAYS, 0x1, 0x1);
  84. glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
  85. r.setupMaterial(*meshNode->mesh->material, *meshNode, r.getCamera());
  86. glDisable(GL_BLEND); // a hack
  87. meshNode->render();
  88. // render the temp FAI to prePassFai
  89. fbo.bind();
  90. glStencilFunc(GL_EQUAL, 0x1, 0x1);
  91. glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
  92. if(meshNode->mesh->material->blends)
  93. {
  94. glEnable(GL_BLEND);
  95. glBlendFunc(meshNode->mesh->material->blendingSfactor, meshNode->mesh->material->blendingDfactor);
  96. }
  97. else
  98. glDisable(GL_BLEND);
  99. refractSProg->bind();
  100. refractSProg->findUniVar("fai")->setTexture(refractFai, 0);
  101. Renderer::drawQuad(0);
  102. // cleanup
  103. glStencilFunc(GL_ALWAYS, 0x1, 0x1);
  104. glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
  105. glClear(GL_STENCIL_BUFFER_BIT);
  106. glDisable(GL_STENCIL_TEST);
  107. }
  108. else
  109. {
  110. fbo.bind();
  111. r.setupMaterial(*meshNode->mesh->material, *meshNode, r.getCamera());
  112. meshNode->render();
  113. }
  114. }
  115. glDepthMask(true);
  116. glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); // the rendering above fucks the polygon mode
  117. Fbo::unbind();
  118. }