深度纹理作为颜色附件

时间:2013-04-24 15:03:03

标签: ios c opengl-es opengl-es-2.0 framebuffer

我喜欢将深度纹理作为颜色附件附加到帧缓冲区。 (我在iOS上,支持GL_OES_depth_texture)

所以我设置了这样的纹理:

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

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, ImageSize.Width, ImageSize.Height, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, 0);


glGenFramebuffers(1, &ColorFrameBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, ColorFrameBuffer);

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, TextureName, 0);

但现在如果我检查帧缓冲状态,我会得到GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT

我在这里做错了什么?

我还尝试了GL_DEPTH_COMPONENT16GL_DEPTH_COMPONENT24_OESGL_DEPTH_COMPONENT32_OES的一些组合,但这些组合不起作用(也支持GL_OES_depth24)

2 个答案:

答案 0 :(得分:2)

你做不到。具有深度内部格式的纹理只能附加到深度附件。具有彩色内部格式的纹理只能附加到颜色附件。

答案 1 :(得分:0)

如前所述,您无法将深度格式的纹理附加为颜色表面。现在看看你的评论,你真的在​​渲染到1通道浮动格式之后。

您可以查看http://www.khronos.org/registry/gles/extensions/OES/OES_texture_float.txt,它允许您使用浮点格式的纹理格式。

然后,您可以将纹理初始化为Alpha地图,该地图仅包含1个通道。

glTexImage2D(GL_TEXTURE_2D,0,GL_ALPHA,ImageSize.Width,ImageSize.Height,0,GL_ALPHA,GL_FLOAT,0);

根据设备支持的扩展程序,这可能有效,也可能无效。