【问题标题】:Depth texture as color attachment作为颜色附件的深度纹理
【发布时间】:2013-04-24 15:03:03
【问题描述】:

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

【问题讨论】:

  • “我在这里做错了什么?” - 正是这个:“我想将深度纹理作为颜色附件附加到帧缓冲区。” .

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


【解决方案1】:

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

【讨论】:

  • 那么就不可能直接从片段着色器写入浮点纹理吗? (当然我可以使用半浮点扩展纹理,但这会给我带来开销,因为我只需要一个 32 位浮点/片段,并且将其拆分为 ARGB888 非常不方便 :-(
  • @V1ru8:如果你问的是关于写入浮动纹理的问题,你应该问那个,而不是关于通过颜色附件写入深度纹理的问题。跨度>
  • 嗯,我认为这就是如何做到这一点;-)
【解决方案2】:

如前所述,您不能将具有深度格式的纹理附加为颜色表面。现在看看您的评论,您真的是在渲染为 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);

这可能会或可能不会工作,具体取决于您的设备支持哪些扩展。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 2013-04-28
    • 2011-10-14
    • 2018-10-28
    • 2021-06-02
    • 2023-03-09
    相关资源
    最近更新 更多