【问题标题】:GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT when attaching a cube map texture to a frame buffer object (FBO)将立方体贴图纹理附加到帧缓冲区对象 (FBO) 时的 GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT
【发布时间】:2013-08-08 12:52:52
【问题描述】:

为了支持点光源的阴影贴图,我需要将我的深度值渲染到立方体贴图的 6 个边。

我的初始化函数如下所示:

public void init(int width, int height) {
    fboId = GL30.glGenFramebuffers();

    GL11.glEnable(GL13.GL_TEXTURE_CUBE_MAP);
    cubeMap = GL11.glGenTextures();

    GL11.glBindTexture(GL13.GL_TEXTURE_CUBE_MAP, cubeMap);

    GL11.glTexParameteri(GL13.GL_TEXTURE_CUBE_MAP,
            GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
    GL11.glTexParameteri(GL13.GL_TEXTURE_CUBE_MAP,
            GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
    GL11.glTexParameteri(GL13.GL_TEXTURE_CUBE_MAP, GL11.GL_TEXTURE_WRAP_S,
            GL11.GL_CLAMP);
    GL11.glTexParameteri(GL13.GL_TEXTURE_CUBE_MAP, GL11.GL_TEXTURE_WRAP_T,
            GL11.GL_CLAMP);
    GL11.glTexParameteri(GL13.GL_TEXTURE_CUBE_MAP, GL12.GL_TEXTURE_WRAP_R,
            GL11.GL_CLAMP);

    for (int i = 0; i < 6; i++)
        GL11.glTexImage2D(GL13.GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0,
                GL14.GL_DEPTH_COMPONENT32, width, height, 0,
                GL11.GL_DEPTH_COMPONENT, GL11.GL_FLOAT, (FloatBuffer) null);

    GL11.glBindTexture(GL13.GL_TEXTURE_CUBE_MAP, 0);
}

这是我用来将立方体贴图的一侧绑定到我的 FBO 的函数:

public void bindForWriting(int target) {
    // target is GL13.GL_TEXTURE_CUBE_MAP_POSITIVE_X etc.

    GL30.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, fboId);
    GL30.glFramebufferTexture2D(GL30.GL_DRAW_FRAMEBUFFER,
            GL30.GL_DEPTH_ATTACHMENT, target, cubeMap, 0);

    // Disable writes to the color buffer.
    GL11.glDrawBuffer(GL11.GL_NONE);

    int fboStat = GL30.glCheckFramebufferStatus(GL30.GL_DRAW_FRAMEBUFFER);

    if (fboStat != GL30.GL_FRAMEBUFFER_COMPLETE) {
        // fboStat is always == GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT
    }

    GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT);
}

很遗憾,FBO 不完整,我不知道为什么。 Khronos 网站说:“并非所有帧缓冲区连接点都是帧缓冲区 附件完成。这意味着至少有一个 带有渲染缓冲区或纹理的连接点 已附加其附加对象不再存在 或具有宽度或高度的附加图像 零,或者颜色附着点有一个 附加的非彩色图像,或 深度附着点具有不可深度渲染 附加图像,或模板连接点有 附加了不可模板渲染的图像。 颜色可渲染格式包括 GL_RGBA4、 GL_RGB5_A1,和 GL_RGB565。 GL_DEPTH_COMPONENT16 是唯一的 可深度渲染的格式。 GL_STENCIL_INDEX8 是唯一的 模板可渲染格式。”

我没有破坏立方体贴图,并且宽度/高度 > 0。我不明白为什么 GL_DEPTH_COMPONENT16 是唯一可深度渲染的格式,因为我用于聚光灯阴影映射的 FBO 与 GL_DEPTH_COMPONENT32 配合得很好。如果我将其更改为 GL_DEPTH_COMPONENT16,仍然会发生相同的错误。

有什么建议吗?

【问题讨论】:

  • 那么bindForWriting 是用什么来调用的?
  • bindForWriting被调用与立方体的侧面上写上:GL13.GL_TEXTURE_CUBE_MAP_POSITIVE_X,GL13.GL_TEXTURE_CUBE_MAP_NEGATIVE_X,GL13.GL_TEXTURE_CUBE_MAP_POSITIVE_Y,GL13.GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,GL13.GL_TEXTURE_CUBE_MAP_POSITIVE_Z,GL13.GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 跨度>
  • 我使用 glGetError 来查看哪一行产生了错误。似乎GL11.glTexImage2D(GL13.GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL14.GL_DEPTH_COMPONENT32, width, height, 0, GL11.GL_DEPTH_COMPONENT, GL11.GL_FLOAT, (FloatBuffer) null); 产生GL_INVALID_VALUE

标签: opengl framebuffer


【解决方案1】:

我发现了问题:

如果目标是六个立方体贴图 2D 图像目标之一并且宽度和高度参数不相等,则生成 GL_INVALID_ENUM。 Source.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-05
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    相关资源
    最近更新 更多