Want more features on Pastebin? Sign Up, it's FREE!
Guest

Untitled

By: a guest on Nov 2nd, 2013  |  syntax: C++  |  size: 8.04 KB  |  views: 60  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. Setup Framebuffer object:
  2.  
  3.         glGenFramebuffers(1, &fbo);
  4.         glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);
  5.  
  6.         glGenTextures(1, &bufferTextures[GBUFFER_TEXTURE_COLOR]);
  7.         glBindTexture(GL_TEXTURE_2D, bufferTextures[GBUFFER_TEXTURE_COLOR]);
  8.         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGBA, GL_FLOAT, NULL);
  9.         glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  10.         glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  11.         glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  12.         glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  13.         glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, bufferTextures[GBUFFER_TEXTURE_COLOR],0);
  14.  
  15.         glGenTextures(1, &bufferTextures[GBUFFER_TEXTURE_POSITION]);
  16.         glBindTexture(GL_TEXTURE_2D, bufferTextures[GBUFFER_TEXTURE_POSITION]);
  17.         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB32F, width, height, 0, GL_RGBA, GL_FLOAT, NULL);
  18.         glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  19.         glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  20.         glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  21.         glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  22.         glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, bufferTextures[GBUFFER_TEXTURE_POSITION],0);
  23.  
  24.         glGenTextures(1, &bufferTextures[GBUFFER_TEXTURE_NORMAL]);
  25.         glBindTexture(GL_TEXTURE_2D, bufferTextures[GBUFFER_TEXTURE_NORMAL]);
  26.         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, width, height, 0, GL_RGBA, GL_FLOAT, NULL);
  27.         glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  28.         glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  29.         glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  30.         glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  31.         glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, GL_TEXTURE_2D, bufferTextures[GBUFFER_TEXTURE_NORMAL],0);
  32.  
  33.         glGenTextures(1, &outputTexture);
  34.         glBindTexture(GL_TEXTURE_2D, outputTexture);
  35.         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_FLOAT, NULL);
  36.         glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  37.         glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  38.         glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  39.         glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  40.         glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT3, GL_TEXTURE_2D, outputTexture,0);
  41.  
  42.  
  43.  
  44.         glGenTextures(1, &depthTexture);
  45.         glBindTexture(GL_TEXTURE_2D, depthTexture);
  46.         glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32F, width, height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);
  47.         glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthTexture,0);
  48.  
  49.         glBindBuffer(GL_DRAW_FRAMEBUFFER, 0);
  50.  
  51.  
  52.  
  53. Here how I setup the vertex array object:
  54.  
  55.  
  56.         for (unsigned int i = 0; i < m_Meshes.size(); ++i)
  57.         {
  58.                 //clear error buffer
  59.                 glGetError();
  60.                 // generate Vertex Array for mesh
  61.                 glGenVertexArrays(1,&(m_Meshes[i]->VertexArrayObject));
  62.                 glBindVertexArray(m_Meshes[i]->VertexArrayObject);
  63.  
  64.                 GLenum err = glGetError();
  65.                 if(err != GL_NO_ERROR)
  66.                 {
  67.                         printf("Error occured: %i", err);
  68.                 }
  69.  
  70.                 // buffer for indices
  71.                 glGenBuffers(1, &buffer);
  72.                 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer);
  73.                 glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint) * m_Meshes[i]->numIndices, m_Meshes[i]->indices, GL_STATIC_DRAW);
  74.                 err = glGetError();
  75.                 if(err != GL_NO_ERROR)
  76.                 {
  77.                         printf("Error occured: %i", err);
  78.                 }
  79.  
  80.                 // buffer for vertex positions
  81.                 if (m_Meshes[i]->numVertices != 0) {
  82.                         glGenBuffers(1, &buffer);
  83.                         glBindBuffer(GL_ARRAY_BUFFER, buffer);
  84.                         glBufferData(GL_ARRAY_BUFFER, sizeof(aiVector3D)*m_Meshes[i]->numVertices, m_Meshes[i]->vertices, GL_STATIC_DRAW);
  85.                         glEnableVertexAttribArray(MODEL_VERTEX_LOCATION);
  86.                         glVertexAttribPointer(MODEL_VERTEX_LOCATION, 3, GL_FLOAT, GL_FALSE, 0, 0);
  87.                         err = glGetError();
  88.                         if(err != GL_NO_ERROR)
  89.                         {
  90.                                 printf("Error occured: %i", err);
  91.                         }
  92.                 }
  93.  
  94.                 // buffer for vertex normals
  95.                 if (m_Meshes[i]->normals->Length() != 0) {
  96.                         glGenBuffers(1, &buffer);
  97.                         glBindBuffer(GL_ARRAY_BUFFER, buffer);
  98.                         glBufferData(GL_ARRAY_BUFFER, sizeof(aiVector3D)*m_Meshes[i]->numVertices, m_Meshes[i]->normals, GL_STATIC_DRAW);
  99.                         glEnableVertexAttribArray(MODEL_NORMAL_LOCATION);
  100.                         glVertexAttribPointer(MODEL_NORMAL_LOCATION, 3, GL_FLOAT, GL_FALSE, 0, 0);
  101.                         err = glGetError();
  102.                         if(err != GL_NO_ERROR)
  103.                         {
  104.                                 printf("Error occured: %i", err);
  105.                         }
  106.                 }
  107.  
  108.                 // buffer for vertex texture coordinates
  109.                 if (m_Materials.size() != 0) {
  110.                        
  111.                         glGenBuffers(1, &buffer);
  112.                         glBindBuffer(GL_ARRAY_BUFFER, buffer);
  113.                         glBufferData(GL_ARRAY_BUFFER, sizeof(aiVector3D) * m_Meshes[i]->numVertices, m_Meshes[i]->textureCoords, GL_STATIC_DRAW);
  114.                         glEnableVertexAttribArray(MODEL_TEXCOORD_LOCATION);
  115.                         glVertexAttribPointer(MODEL_TEXCOORD_LOCATION, 3, GL_FLOAT, GL_FALSE, 0, 0);
  116.                         err = glGetError();
  117.                         if(err != GL_NO_ERROR)
  118.                         {
  119.                                 printf("Error occured: %i", err);
  120.                         }
  121.                 }
  122.  
  123.                 // buffer for tangents
  124.                 if(m_Meshes[i]->tangents != NULL)
  125.                 {
  126.                         glGenBuffers(1, &buffer);
  127.                         glBindBuffer(GL_ARRAY_BUFFER, buffer);
  128.                         glBufferData(GL_ARRAY_BUFFER, sizeof(aiVector3D) * m_Meshes[i]->numVertices, m_Meshes[i]->tangents, GL_STATIC_DRAW);
  129.                         glEnableVertexAttribArray(MODEL_TANGENT_LOCATION);
  130.                         glVertexAttribPointer(MODEL_TANGENT_LOCATION,3,GL_FLOAT,GL_FALSE,0,(void*)0);
  131.                         err = glGetError();
  132.                         if(err != GL_NO_ERROR)
  133.                         {
  134.                                 printf("Error occured: %i", err);
  135.                         }
  136.                 }
  137.  
  138.                 // buffer for bitangents
  139.                 if(m_Meshes[i]->Bitangents != NULL)
  140.                 {
  141.                         glGenBuffers(1, &buffer);
  142.                         glBindBuffer(GL_ARRAY_BUFFER, buffer);
  143.                         glBufferData(GL_ARRAY_BUFFER, sizeof(aiVector3D) * m_Meshes[i]->numVertices, m_Meshes[i]->Bitangents, GL_STATIC_DRAW);
  144.                         glEnableVertexAttribArray(MODEL_BITANGENT_LOCATION);
  145.                         glVertexAttribPointer(MODEL_BITANGENT_LOCATION,3,GL_FLOAT,GL_FALSE,0,(void*)0);
  146.                         err = glGetError();
  147.                         if(err != GL_NO_ERROR)
  148.                         {
  149.                                 printf("Error occured: %i", err);
  150.                         }
  151.                 }
  152.  
  153.                 // unbind buffers
  154.                 glBindVertexArray(0);
  155.                 glBindBuffer(GL_ARRAY_BUFFER,0);
  156.                 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
  157.                 err = glGetError();
  158.                 if(err != GL_NO_ERROR)
  159.                 {
  160.                         printf("Error occured: %i", err);
  161.                 }
  162.  
  163.                 // create material uniform buffer
  164.                 glGenBuffers(1,&(m_Meshes[i]->materialUniformIndex));
  165.                 glBindBuffer(GL_UNIFORM_BUFFER,m_Meshes[i]->materialUniformIndex);
  166.                 glBufferData(GL_UNIFORM_BUFFER, sizeof(Material), (void *)(m_Meshes[i]->material), GL_STATIC_DRAW);
  167.                 err = glGetError();
  168.                 if(err != GL_NO_ERROR)
  169.                 {
  170.                         printf("Error occured: %i", err);
  171.                 }
  172.         }
  173.  
  174.  
  175. Here the rendering to GBuffer:
  176.  
  177.         glEnable(GL_DEPTH_TEST);
  178.         glDepthMask(true);
  179.         glCullFace(GL_BACK);
  180.         glDisable(GL_BLEND);
  181.  
  182.         glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);
  183.  
  184.         GLenum DrawBuffers[] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2};
  185.         glDrawBuffers(GBUFFER_NUM_TEXTURES, DrawBuffers);
  186.         glUseProgram(gBufferShader);
  187.  
  188.         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  189.  
  190.         [matrices setup and uniforms etc]
  191.  
  192.         for (unsigned int n=0; n < m_Meshes.size(); ++n)
  193.         {
  194.                 glBindVertexArray(m_Meshes[n]->VertexArrayObject);
  195.                 glDrawElementsBaseVertex(GL_TRIANGLES, m_Meshes[n]->numIndices, GL_UNSIGNED_INT, 0, 0);
  196.         }
  197.  
  198.  
  199.  
  200. How i render the gbuffer:
  201.  
  202.         glUseProgram(0);
  203.         glBindFramebuffer(GL_FRAMEBUFFER, 0);
  204.  
  205.         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  206.         glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
  207.  
  208.         glReadBuffer(GL_COLOR_ATTACHMENT0);
  209.         glBlitFramebuffer(0, 0, screenWidth, screenHeight, 0, 0, screenWidth/2, screenHeight/2, GL_COLOR_BUFFER_BIT, GL_LINEAR);
  210.  
  211.         glReadBuffer(GL_COLOR_ATTACHMENT1);
  212.         glBlitFramebuffer(0, 0, screenWidth, screenHeight, screenWidth/2, 0, screenWidth, screenHeight/2, GL_COLOR_BUFFER_BIT, GL_LINEAR);
  213.  
  214.         glReadBuffer(GL_COLOR_ATTACHMENT2);
  215.         glBlitFramebuffer(0, 0, screenWidth, screenHeight, 0, screenHeight/2, screenWidth/2, screenHeight, GL_COLOR_BUFFER_BIT, GL_LINEAR);
clone this paste RAW Paste Data