【问题标题】:Opengl framebuffer separate stencil textureOpengl 帧缓冲分离模板纹理
【发布时间】:2016-09-27 03:35:54
【问题描述】:

我找不到任何有关帧缓冲区对象的单独模板纹理的文档。基本上这是我到目前为止所拥有的:

glBindTexture(GL_TEXTURE_2D, this->mTextures[FRAMEBUFFER_STENCIL_TEXTURE]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_R8I, width, height, 0, GL_RED_INTEGER, GL_INT, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,  GL_TEXTURE_2D, this->mTextures[FRAMEBUFFER_STENCIL_TEXTURE],    0);

但这会导致创建错误。是我的格式错误还是其他原因?

【问题讨论】:

    标签: c++ opengl


    【解决方案1】:

    是的,这些格式值对于模板纹理是错误的。您需要为 internalFormatformat 使用特定的模板枚举。对于 8 位模板纹理,调用应该如下所示:

    glTexImage2D(GL_TEXTURE_2D, 0, GL_STENCIL_INDEX8,
                 width, height, 0, GL_STENCIL_INDEX, GL_UNSIGNED_BYTE, 0);
    

    正如 cmets 中所指出的,纯模板纹理仅在 OpenGL 4.4 及更高版本中可用。

    另一种方法是分配深度/模板纹理,而不使用深度部分。但是,从深度/模板纹理的模板部分采样需要 OpenGL 4.3 或更高版本,因此只会将版本要求降低一个次要版本。

    【讨论】:

    • 非常感谢您的回答。我试过了,但不幸的是它仍然崩溃。我设法在 opengl 官方文档上找到了这个,但它似乎只适用于 opengl 4.4+...我在 opengl 2 上,所以我只坚持使用深度和模板组合纹理吗?
    • @Jas OpenGL 2.x 没有帧缓冲对象,所以这些都不适用。
    • 嗯,我正在使用着色器版本 130,我认为它应该适用于 opengl 2……但我确实可以访问帧缓冲区对象。
    • @Jas:好的,在我们进一步讨论这个问题之前,您需要知道您实际使用的是什么。 OpenGL 2.0 的实现不会采用 GLSL 1.30 着色器。它将阻塞#version 130 声明。所以你需要弄清楚你实际上拥有什么。
    • GLSL 1.30 与 OpenGL 3.0 一起使用。我不知道模板纹理是最近的 4.4。但是,在查找之后,从深度/模板纹理的模板部分进行采样需要 4.3,因此无论如何这将是从纹理中采样模板值所需的最低版本。
    猜你喜欢
    • 2011-11-24
    • 1970-01-01
    • 2014-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多