2013-04-24 45 views
1

我喜欢将深度纹理作为颜色附件附加到帧缓冲区。 (我在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也支持)

+1

*“我在这做错了什么?”* - 完全是这样的:*“我想将深度纹理作为颜色附件附加到帧缓冲区。”*。 – 2013-04-24 15:32:46

回答

2

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

+0

那么有没有可能写入从片段着色器直接写入浮动纹理? (当然,我可以使用半浮动扩展纹理,但这会给我一个开销,因为我只需要一个32位浮点/碎片,并将它分割成ARGB888非常不方便:-( – V1ru8 2013-04-24 16:12:39

+1

@ V1ru8:如果您问的是写一个浮动纹理,你应该询问*那*,而不是通过颜色附件写入深度纹理。 – 2013-04-24 16:29:10

+0

嗯,我认为这是如何做到这一点;-) – V1ru8 2013-04-24 21:48:34

0

如前面提到的答案,您不能将具有深度格式的纹理作为颜色表面添加。现在看看你的评论,你真的在​​渲染成1通道浮点格式之后。

你可以看看http://www.khronos.org/registry/gles/extensions/OES/OES_texture_float.txt它允许你有一个纹理格式的浮动格式。

然后,您可以将纹理初始化为Alpha图,该图只包含1个通道。 glDexImage2D(GL_TEXTURE_2D,0,GL_ALPHA,ImageSize.Width,ImageSize.Height,0,GL_ALPHA,GL_FLOAT,0);

这可能会也可能不会工作,具体取决于设备支持的扩展名。