将立方体贴图纹理附加到帧缓冲对象(FBO)时的GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT

时间:2013-08-08 12:52:52

标签: opengl framebuffer

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

我的init函数如下所示:

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是唯一的                         模板可渲染格式。“

我没有销毁立方体贴图,宽度/高度是&gt; 0.我不明白为什么GL_DEPTH_COMPONENT16是唯一的深度渲染格式,因为我用于聚光灯阴影映射的FBO可以正常使用GL_DEPTH_COMPONENT32。如果我将其更改为GL_DEPTH_COMPONENT16,则仍会出现相同的错误。

有什么建议吗?

1 个答案:

答案 0 :(得分:3)

我发现了问题:

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