r_pps.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. #include "renderer.h"
  2. #include "Resource.h"
  3. #include "Texture.h"
  4. #include "r_private.h"
  5. #include "fbo.h"
  6. namespace r {
  7. namespace pps {
  8. namespace edgeaa {
  9. bool enabled = false;
  10. }
  11. /*
  12. =======================================================================================================================================
  13. VARS =
  14. =======================================================================================================================================
  15. */
  16. static fbo_t fbo; // yet another FBO
  17. Texture fai;
  18. // shader stuff
  19. static ShaderProg* shdr_post_proc_stage;
  20. namespace shdr_vars
  21. {
  22. int is_fai;
  23. int pps_ssao_fai;
  24. int ms_normal_fai;
  25. int hdr_fai;
  26. int lscatt_fai;
  27. }
  28. /*
  29. =======================================================================================================================================
  30. init =
  31. =======================================================================================================================================
  32. */
  33. void Init()
  34. {
  35. // create FBO
  36. fbo.Create();
  37. fbo.Bind();
  38. // inform in what buffers we draw
  39. fbo.SetNumOfColorAttachements(1);
  40. // create the texes
  41. fai.createEmpty2D( r::w, r::h, GL_RGB, GL_RGB );
  42. // attach
  43. glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, fai.getGlId(), 0 );
  44. // test if success
  45. if( !fbo.IsGood() )
  46. FATAL( "Cannot create post-processing stage FBO" );
  47. fbo.Unbind();
  48. // init the shader and it's vars
  49. shdr_post_proc_stage = rsrc::shaders.load( "shaders/pps.glsl" );
  50. shdr_post_proc_stage->bind();
  51. shdr_vars::is_fai = shdr_post_proc_stage->getUniLoc( "is_fai" );
  52. if( r::pps::ssao::enabled )
  53. {
  54. r::pps::ssao::Init();
  55. shdr_vars::pps_ssao_fai = shdr_post_proc_stage->getUniLoc( "pps_ssao_fai" );
  56. }
  57. if( r::pps::hdr::enabled )
  58. {
  59. r::pps::hdr::Init();
  60. shdr_vars::hdr_fai = shdr_post_proc_stage->getUniLoc( "pps_hdr_fai" );
  61. }
  62. if( r::pps::edgeaa::enabled )
  63. shdr_vars::ms_normal_fai = shdr_post_proc_stage->getUniLoc( "ms_normal_fai" );
  64. if( r::pps::lscatt::enabled )
  65. {
  66. r::pps::lscatt::Init();
  67. shdr_vars::lscatt_fai = shdr_post_proc_stage->getUniLoc( "pps_lscatt_fai" );
  68. }
  69. }
  70. /*
  71. =======================================================================================================================================
  72. RunStage =
  73. =======================================================================================================================================
  74. */
  75. void RunStage( const Camera& cam )
  76. {
  77. if( r::pps::ssao::enabled )
  78. r::pps::ssao::RunPass( cam );
  79. if( r::pps::hdr::enabled )
  80. r::pps::hdr::RunPass( cam );
  81. if( r::pps::lscatt::enabled )
  82. r::pps::lscatt::RunPass( cam );
  83. fbo.Bind();
  84. // set GL
  85. glDisable( GL_DEPTH_TEST );
  86. glDisable( GL_BLEND );
  87. r::SetViewport( 0, 0, r::w, r::h );
  88. // set shader
  89. shdr_post_proc_stage->bind();
  90. r::is::fai.bind(0);
  91. //r::ms::depth_fai.bind(0);
  92. glUniform1i( shdr_vars::is_fai, 0 );
  93. if( r::pps::ssao::enabled )
  94. {
  95. r::pps::ssao::blured_fai.bind(1);
  96. glUniform1i( shdr_vars::pps_ssao_fai, 1 );
  97. }
  98. if( r::pps::edgeaa::enabled )
  99. {
  100. r::ms::normal_fai.bind(2);
  101. glUniform1i( shdr_vars::ms_normal_fai, 2 );
  102. }
  103. if( r::pps::hdr::enabled )
  104. {
  105. r::pps::hdr::pass2_fai.bind(3);
  106. //r::bs::r_fai.bind(3);
  107. glUniform1i( shdr_vars::hdr_fai, 3 );
  108. }
  109. if( r::pps::lscatt::enabled )
  110. {
  111. r::pps::lscatt::fai.bind(4);
  112. glUniform1i( shdr_vars::lscatt_fai, 4 );
  113. }
  114. // draw quad
  115. r::DrawQuad( shdr_post_proc_stage->getAttribLoc(0) );
  116. // unbind FBO
  117. fbo.Unbind();
  118. }
  119. }} // end namespaces