2014-11-14 64 views
0

我在我的代码中引用OpenGL Superbible 6。 首先,我只是想在我的3D场景中实现对象拾取。最终我决定使用framebuffer对象,并且我已经成功了,然后我理解了需要解决多边形边缘混叠问题的问题,所以,我再次重写了我的代码以使用GL_TEXTURE_2D_MULTISAMPLE屏外渲染opengl 4.5多重采样FBO

Here对于帧缓冲 无效window_glview)

{ 
    //CREATE FRAMEBUFFER OBJECT 
    GLenum gl_error=glGetError(); 

    glGenTextures(1,&texture_id_framebuffer_color); 
    glBindTexture(GL_TEXTURE_2D_MULTISAMPLE,texture_id_framebuffer_color); 
    glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE,ANTIALIASING_SAMPLES,GL_RGBA8,client_area.right,client_area.bottom,GL_TRUE); 

    glGenTextures(1,&texture_id_framebuffer_objectid); 
    glBindTexture(GL_TEXTURE_2D_MULTISAMPLE,texture_id_framebuffer_objectid); 
    glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE,ANTIALIASING_SAMPLES,GL_RGBA8,client_area.right,client_area.bottom,GL_TRUE); 

    glGenTextures(1,&texture_id_framebuffer_depth); 
    glBindTexture(GL_TEXTURE_2D_MULTISAMPLE,texture_id_framebuffer_depth); 
    glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE,ANTIALIASING_SAMPLES,GL_DEPTH_COMPONENT32,client_area.right,client_area.bottom,GL_TRUE); 
    gl_error=glGetError(); 

    glGenFramebuffers(1,&buffer_id_framebuffer); 
    glBindFramebuffer(GL_FRAMEBUFFER,buffer_id_framebuffer); 
    gl_error=glGetError(); 
    glFramebufferTexture(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,texture_id_framebuffer_color,0); 
    glFramebufferTexture(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,texture_id_framebuffer_objectid,0); 
    glFramebufferTexture(GL_FRAMEBUFFER,GL_DEPTH_ATTACHMENT,texture_id_framebuffer_depth,0); 

    GLenum draw_buffers[] = 
    { 
     GL_COLOR_ATTACHMENT0, 
     GL_COLOR_ATTACHMENT1 
    }; 
    glDrawBuffers(2,draw_buffers); 
    GLenum status=glCheckFramebufferStatus(GL_FRAMEBUFFER); 

    if(status!=GL_FRAMEBUFFER_COMPLETE) 
     MessageBox(0,L"Failed to create framebuffer object",0,0); 
    glBindFramebuffer(GL_FRAMEBUFFER,0); 
} 

初始化代码:: init_framebuffer(这是很常见的大多数互联网房源关于同一主题。 现在,这里是我的绘制代码

void window_glview::paint() 
{ 
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 


     //DRAW TO CUSTOM FRAMEBUFFER 
     glBindFramebuffer(GL_FRAMEBUFFER,buffer_id_framebuffer); 
     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 

     glLineWidth(1.0); 
     draw_viewport(); 
     viewport_object_count=0; 

     draw_lights(); 
     glLineWidth(1.5); 
     for (unsigned short i=0;i<mesh_count;i++) 
     { 
      draw_mesh(mesh_table[i],GL_TRIANGLES,false); 
     } 

    //DRAW TO DEFAULT 
    glBindFramebuffer(GL_FRAMEBUFFER,0); 

    //USE TEXTURE FROM FRAMEBUFFER COLOR_ATTACHMENT0 
    glUseProgram(program_id_screen_render); 
    glBindTexture(GL_TEXTURE_2D_MULTISAMPLE,texture_id_framebuffer_color); 

    //HERE IS A QUAD DRAWING PROCESS 
    glBindBuffer(GL_ARRAY_BUFFER,buffer_id_screen_quad); 
    glVertexAttribPointer(0,4,GL_FLOAT,GL_FALSE,24,0); 
    glEnableVertexAttribArray(0); 

    glDrawArrays(GL_QUADS,0,4); 
    SwapBuffers(hDC); 
} 

顶点着色器是简单

#version 450 

layout(location=0) in vec4 _pos; 
void main(void) 
{ 
    gl_Position=_pos; 
} 

片段着色器与iterpreting多重采样

#version 450 
uniform sampler2DMS screen_texture; 
layout(location=0) out vec4 out_color; 

void main(void) 
{ 
    ivec2 coord=ivec2(gl_FragCoord.xy); 
    vec4 result=vec4(0.0); 
    int i; 
    for (i=0;i<4;i++) 
    { 
     result=max(result,texelFetch(screen_texture,coord,i)); 
    } 
    out_color=result; 
} 

我结束了黑屏的目的编写的。如果我将out_color更改为虱子out_color = vec4(1.0,0.0,0.0,1.0),我会看到红色的屏幕。

  1. 什么可能出错?
  2. 在我将GL_DEPTH_COMPONENT传递给glTexStorage2DMultisample的framebuffer的初始化函数中,出现错误。我决定通过GL_DEPTH_COMPONENT16,它的工作原理。这是为什么?
  3. 我是否应该更好地使用RENDERBUFFER进行某些处理,如果是的话,我该如何读取纹理?

回答

1

ID为texture_id_framebuffer_color质地,这是您用于最终渲染的质感,而你渲染到FBO没有连接到FBO:

glFramebufferTexture(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,texture_id_framebuffer_color,0); 
glFramebufferTexture(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,texture_id_framebuffer_objectid,0); 

只有一个纹理可以连接到一次给定的附着点。因此,当您指定要附加到COLOR_ATTACHMENT0的第二个纹理时,第一个贴图会自动取消连接。

如果你想有两个附件,他们将需要使用不同的附着点:

glFramebufferTexture(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,texture_id_framebuffer_color,0); 
glFramebufferTexture(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT1,texture_id_framebuffer_objectid,0); 
+0

非常感谢。我本人从来没有发现这个错字。 – Antiusninja