我在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文档,我无法理解为什么上面的代码不起作用。我想要的只是渲染纹理的深度...我错过了什么?
答案 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琐事之夜炫耀。如果有这样的事情。 :)