将OpenGL ES Framebuffer移植到OpenGL

时间:2015-02-04 04:56:39

标签: opengl opengl-es-2.0 opengl-3

我在iOS和Android上完成了以下代码:

unsigned int depth_texture = 0,
             framebuffer = 0;

glGenTextures( 1, &depth_texture );
glBindTexture( GL_TEXTURE_2D, depth_texture );

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );

glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );

glTexImage2D( GL_TEXTURE_2D,
              0,
              GL_DEPTH_COMPONENT,
              256,
              256,
              0,
              GL_DEPTH_COMPONENT,
              GL_UNSIGNED_INT,
              NULL );

glBindTexture( GL_TEXTURE_2D, 0 );

glGenFramebuffers( 1, &framebuffer );

glBindFramebuffer( GL_FRAMEBUFFER, framebuffer );

glFramebufferTexture2D( GL_FRAMEBUFFER,
                        GL_DEPTH_ATTACHMENT,
                        GL_TEXTURE_2D,
                        depth_texture,
                        0 );

unsigned int type = glCheckFramebufferStatus( GL_FRAMEBUFFER );

if( type == GL_FRAMEBUFFER_COMPLETE )
{ printf( "Complete!" ); }
else
{ printf( "Error!" ); }

现在我将此代码移植到OpenGL Desktop(2.1及更高版本),它拒绝工作。我总是得到错误GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER。我发现使其工作的唯一方法是指定COLOR_ATTACHMENT(这将修复绘制缓冲区错误)。我读了GL glFrameBuffer文档,我无法理解为什么上面的代码不起作用。我想要的只是渲染纹理的深度...我错过了什么?

1 个答案:

答案 0 :(得分:2)

如果您不想渲染到任何颜色缓冲区,则需要一个指定以下内容的调用:

glDrawBuffer(GL_NONE);

这是每个帧缓冲状态,因此需要在绑定FBO时调用它。

如果你错过了这个,你会得到你正在看到的错误,如#34; Framebuffer Completeness"中的错误条件所规定的那样。在OpenGL 3.3规范中:

  

对于DRAW_BUFFERi指定的任何颜色附加点,FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE的值不得为NONE。

     

{FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER}

FBO的默认绘制缓冲区为GL_COLOR_ATTACHMENT0,因此如果您没有GL_COLOR_ATTACHMENT0的附件,则会出现此错误情况,并将绘制缓冲区保留为默认值。

为避免出现非常相似的GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER错误情况,您还需要将读取缓冲区设置为GL_NONE

glReadBuffer(GL_NONE);

据我所知,任何 OpenGL ES规范中列出了 这些错误情况。因此,那里不需要glDrawBuffer()电话。

它仍然很奇怪:检查从3.0开始的所有桌面OpenGL规范,其中引入了FBO,错误条件列在3.1,3.2,3.3和4.0的规范中。它不是3.0,更有趣的是,它在4.1及更高版本中消失。正如@derhass在评论中指出的那样,这是ARB_ES2_compatibility扩展的一部分,它在OpenGL 4.1中成为核心。

记住这一点,你可以在下一个OpenGL琐事之夜炫耀。如果有这样的事情。 :)