关于使用gl_luminance的glteximage2d的谜题

时间:2014-06-22 04:37:22

标签: opengl-es opengl-es-2.0 glteximage2d

我遇到了一些关于使用gl_luminance来定义FBO的问题。这是我使用的代码,

 generateRenderToTexture(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, _maskTexture, _imageWidth, _imageHeight, false);

相关代码如下,

TextureBuffer _maskTexture;

class TextureBuffer {
public:
GLuint texture;
GLuint frameBuffer;
GLenum internalformat;
GLenum format;
GLenum type;
int    w,h;

TextureBuffer() : texture(0), frameBuffer(0) {}
void release() 
{
    if(texture)
    {
        glDeleteTextures(1, &texture);
        texture = 0;
    }
    if(frameBuffer)
    {
        glDeleteFramebuffers(1, &frameBuffer);
        frameBuffer = 0;
    }

}
};

void generateRenderToTexture(GLint internalformat, GLenum format, GLenum type,
                                     TextureBuffer &tb, int w, int h, bool linearInterp)
{
    glGenTextures(1, &tb.texture);
    glBindTexture(GL_TEXTURE_2D, tb.texture);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, linearInterp ? GL_LINEAR : GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, linearInterp ? GL_LINEAR : GL_NEAREST);
    glTexImage2D(GL_TEXTURE_2D, 0, internalformat, w, h, 0, format, type, NULL);

    glGenFramebuffers(1, &tb.frameBuffer);
    glBindFramebuffer(GL_FRAMEBUFFER, tb.frameBuffer);
    glClear(_glClearBits);
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tb.texture, 0);

    GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
    if(status != GL_FRAMEBUFFER_COMPLETE)
        printf("Framebuffer status: %x", (int)status);

    tb.internalformat = internalformat;
    tb.format = format;
    tb.type = type;
    tb.w = w;
    tb.h = h;
}

问题是我什么时候使用,

generateRenderToTexture(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, _maskTexture, _imageWidth, _imageHeight, false);

代码进展顺利。但是如果使用gl_luminance,

generateRenderToTexture(GL_LUMINANCE, GL_LUMINANCE, GL_UNSIGNED_BYTE,  _maskTexture,  _imageWidthOriginal, 

我不知道为什么我不能使用GL_LUMINANCE来定义FBO。任何人都有一些有用的建议来解决这个问题吗?

3 个答案:

答案 0 :(得分:4)

根据规范文档中的表4.5,唯一可以保证在ES 2.0中用作彩色FBO附件的格式是:

  • GL_RGBA4
  • GL_RGB5_A1
  • GL_RGB565

标准不要求支持渲染到适合您的GL_RGBA。但是,许多实现都支持它。 OES_rgb8_rgba8 extension添加了对GL_RGB8GL_RGBA8格式的支持作为渲染目标。

标准不支持

GL_LUMINANCE作为颜色可渲染格式,我也无法找到它的扩展名。一些实现可能会支持它,但你当然不能指望它。

ES 3.0将GL_R8列为颜色可渲染格式。在ES 3.0中,RED / R格式替换了ES 2.0中的LUMINANCE / ALPHA格式。因此,如果您可以转移到ES 3.0,则可以支持渲染为单分量纹理格式。

答案 1 :(得分:1)

您正在使用非扩展FBO功能,这些功能仅在OpenGL-3中引入。因此,与FBO扩展函数(以ARB结尾)不同,这些函数仅适用于OpenGL-3上下文。在OpenGL-3中,不推荐使用GL_LUMINANCE和GL_ALPHA纹理内部格式,这些格式在核心配置文件中不可用。它们已被GL_RED纹理格式替换。您可以使用适当编写的着色器或纹理swizzle参数来使GL_RED纹理像GL_LUMINANCE(swizzle dst.rgb = texture.r)或GL_ALPHA(swizzle dst.a = texture.r)一样工作。

答案 2 :(得分:0)

我已经通过使用GL_RG_EXT或GL_RED_EXT来解决。