Advertisement
Guest User

Untitled

a guest
Aug 17th, 2017
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.38 KB | None | 0 0
  1. /*
  2. * Renderer.cpp
  3. * DerpFort
  4. *
  5. * Created by Justin Li on 11-03-25.
  6. * Copyright 2011 Frustra Software Design. All rights reserved.
  7. *
  8. */
  9.  
  10. #include "Renderer.h"
  11. #include "DerpFort.h"
  12.  
  13. Renderer::Renderer()
  14. {
  15.  
  16. }
  17.  
  18. Renderer::~Renderer()
  19. {
  20. }
  21.  
  22. #include <iostream>
  23. void Renderer::initFramebuffers()
  24. {
  25. if (gl.shaderManager.getShaderVersion() < 2) return; // only used for shaders anyways
  26.  
  27. gBufferFBO.init(2, 1);
  28. postProcessingFBO[0].init(1, 1);
  29. postProcessingFBO[1].init(1, 1);
  30. }
  31.  
  32. void Renderer::initShadowBuffers()
  33. {
  34. int shadowMapWidth = gl.width * config.r_lightdetail.val / 4.0;
  35. int shadowMapHeight = gl.height * config.r_lightdetail.val / 4.0;
  36.  
  37. //GLfloat borderColor[4] = {0,0,0,0};
  38.  
  39. GLenum FBOstatus;
  40.  
  41. // Try to use a texture depth component
  42. glGenTextures(1, &depthTextureId);
  43. glBindTexture(GL_TEXTURE_2D, depthTextureId);
  44.  
  45. // GL_LINEAR does not make sense for depth texture. However, next tutorial shows usage of GL_LINEAR and PCF. Using GL_NEAREST
  46. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  47. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  48.  
  49. // Remove artefact on the edges of the shadowmap
  50. glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP );
  51. glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );
  52.  
  53. // This is to allow usage of shadow2DProj function in the shader
  54. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE);
  55. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
  56. glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_INTENSITY);
  57.  
  58.  
  59. // No need to force GL_DEPTH_COMPONENT24, drivers usually give you the max precision if available
  60. glTexImage2D( GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, shadowMapWidth, shadowMapHeight, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, 0);
  61.  
  62.  
  63. GLuint tmpTextureId;
  64.  
  65. glGenTextures(1, &tmpTextureId);
  66. glBindTexture(GL_TEXTURE_2D, tmpTextureId);
  67.  
  68. glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA16F, shadowMapWidth, shadowMapHeight, 0, GL_RGBA, GL_FLOAT, 0);
  69. glBindTexture(GL_TEXTURE_2D, 0);
  70.  
  71. // create a framebuffer object
  72. glGenFramebuffersEXT(1, &fboId);
  73. glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboId);
  74.  
  75. // Instruct openGL that we won't bind a color texture with the currently binded FBO
  76. glDrawBuffer(GL_NONE);
  77. glReadBuffer(GL_NONE);
  78.  
  79. // attach the texture to FBO depth attachment point
  80. glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,GL_TEXTURE_2D, depthTextureId, 0);
  81. glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,GL_TEXTURE_2D, tmpTextureId, 0);
  82.  
  83. // check FBO status
  84. FBOstatus = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
  85. if(FBOstatus != GL_FRAMEBUFFER_COMPLETE_EXT)
  86. printf("GL_FRAMEBUFFER_COMPLETE_EXT failed, CANNOT use FBO: %x\n", FBOstatus);
  87.  
  88. // switch back to window-system-provided framebuffer
  89. glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
  90. }
  91.  
  92. void Renderer::render()
  93. {
  94. m_lastModelViewMatrix = m_modelViewMatrix;
  95.  
  96. GLfloat projection[16];
  97. glGetFloatv(GL_PROJECTION_MATRIX, projection);
  98. m_projectionMatrix = glh::matrix4f(projection);
  99.  
  100. GLfloat modelview[16];
  101. glGetFloatv(GL_MODELVIEW_MATRIX, modelview);
  102. m_modelViewMatrix = glh::matrix4f(modelview);
  103.  
  104. m_inverseProjectionMatrix = (m_projectionMatrix * m_modelViewMatrix).inverse().transpose();
  105.  
  106. gl.shaderManager.getShader("gBuffer")->use();
  107. glUniformMatrix4fv(gl.shaderManager.getShader("gBuffer")->getUniformLocation("m_lastModelViewMatrix"), 1, GL_FALSE, m_lastModelViewMatrix.m);
  108. gl.shaderManager.unUseProgram();
  109.  
  110. renderWorld(true);
  111. renderPostProcessing();
  112. }
  113.  
  114. void Renderer::renderWorld(bool shaders)
  115. {
  116. glPushMatrix();
  117. glEnableClientState(GL_VERTEX_ARRAY);
  118. glEnableClientState(GL_COLOR_ARRAY);
  119. glEnableClientState(GL_TEXTURE_COORD_ARRAY);
  120. glEnable(GL_TEXTURE_2D);
  121.  
  122. maps[0].tex.bind();
  123. if (gl.shaderManager.getShaderVersion() > 1 && shaders)// && config.r_ssao.val)
  124. {
  125. gBufferFBO.bind();
  126.  
  127. GLenum mrt[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 };
  128. glDrawBuffers(2, mrt);
  129.  
  130. glClearColor(0, 0, 0, 0);
  131. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  132.  
  133. gl.shaderManager.getShader("gBuffer")->use();
  134.  
  135. maps[0].renderMapArrays();
  136.  
  137. gl.shaderManager.unUseProgram();
  138.  
  139. glBindFramebuffer(GL_FRAMEBUFFER, 0);
  140. int err = glGetError();
  141. if (err) printf("OpenGL Error: %d\n", err);
  142. } else {
  143. glClearColor(0, 0, 0, 0);
  144. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  145.  
  146. maps[0].renderMapArrays();
  147. }
  148.  
  149. glDisable(GL_TEXTURE_2D);
  150. glDisableClientState(GL_COLOR_ARRAY);
  151. glDisableClientState(GL_VERTEX_ARRAY);
  152. glDisableClientState(GL_TEXTURE_COORD_ARRAY);
  153. glPopMatrix();
  154. }
  155.  
  156. void Renderer::renderPostProcessing()
  157. {
  158. if (gl.shaderManager.getShaderVersion() < 2) return;
  159.  
  160. // Set up ortho view
  161. glPushAttrib(GL_ENABLE_BIT | GL_CURRENT_BIT | GL_TRANSFORM_BIT);
  162. glMatrixMode(GL_PROJECTION);
  163. glPushMatrix();
  164. glLoadIdentity();
  165. gluOrtho2D(m_pViewport.viewport[0], m_pViewport.viewport[2], m_pViewport.viewport[1], m_pViewport.viewport[3]);
  166. glMatrixMode(GL_MODELVIEW);
  167. glPushMatrix();
  168. glLoadIdentity();
  169. glDisable(GL_DEPTH_TEST);
  170. glDisable(GL_TEXTURE_2D);
  171. glDisable(GL_LIGHTING);
  172.  
  173. glActiveTexture(GL_TEXTURE0);
  174. glBindTexture(GL_TEXTURE_2D, gBufferFBO.getTargets()[0]);
  175.  
  176. if (config.r_postprocessing.val)
  177. {
  178. glActiveTexture(GL_TEXTURE1);
  179. glBindTexture(GL_TEXTURE_2D, gBufferFBO.getTargets()[1]);
  180. glActiveTexture(GL_TEXTURE2);
  181. glBindTexture(GL_TEXTURE_2D, gBufferFBO.getDepthTex());
  182. glActiveTexture(GL_TEXTURE0);
  183.  
  184. std::list<std::string> effectList = gl.effectManager.getEnabledEffects();
  185. std::list<std::string>::iterator effectIterator = effectList.begin();
  186.  
  187. bool whichFBO = 0, effected;
  188.  
  189. while (effectIterator != effectList.end())
  190. {
  191. BaseEffect *ef = gl.effectManager.getEffect(*effectIterator);
  192.  
  193. postProcessingFBO[whichFBO].bind();
  194.  
  195. effected = ef->process(gl.width, gl.height);
  196.  
  197. if (effected)
  198. {
  199. glActiveTexture(GL_TEXTURE0);
  200. glBindTexture(GL_TEXTURE_2D, postProcessingFBO[whichFBO].getTargets()[0]);
  201. whichFBO = !whichFBO;
  202. }
  203. ++effectIterator;
  204. }
  205.  
  206. postProcessingFBO[0].unBind();
  207. }
  208.  
  209. //glBindTexture(GL_TEXTURE_2D, gBufferFBO.getTargets()[1]);
  210. glEnable(GL_TEXTURE_2D);
  211. gl.drawOrthoQuad(gl.width, gl.height);
  212.  
  213. // Revert modes
  214. glActiveTexture(GL_TEXTURE0);
  215. glPopMatrix();
  216. glMatrixMode(GL_PROJECTION);
  217. glPopMatrix();
  218. glPopAttrib();
  219. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement