Advertisement
Guest User

Untitled

a guest
Nov 2nd, 2013
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.04 KB | None | 0 0
  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);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement