Opengl es 关于使用GLU亮度的GLTEXAGE2D的争论

Opengl es 关于使用GLU亮度的GLTEXAGE2D的争论,opengl-es,opengl-es-2.0,glteximage2d,Opengl Es,Opengl Es 2.0,Glteximage2d,关于使用gl_亮度定义FBO,我遇到了一些问题。这是我使用的代码 generateRenderToTexture(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, _maskTexture, _imageWidth, _imageHeight, false); 相关代码如下: TextureBuffer _maskTexture; class TextureBuffer { public: GLuint texture; GLuint frameBuffer; GLe

关于使用gl_亮度定义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_亮度

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

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

您使用的是非扩展FBO函数,它仅在OpenGL-3中引入。因此,与FBO扩展函数(以
ARB
结尾)不同,这些函数仅在OpenGL-3上下文中可用。在OpenGL-3中,GL_亮度和GL_ALPHA纹理内部格式已被弃用,在core profile中不可用。它们已被GL_红色纹理格式取代。您可以使用适当编写的着色器或纹理swizzle参数使GL_红色纹理像GL_亮度(swizzle
dst.rgb=texture.r
)或GL_ALPHA(swizzle
dst.a=texture.r
)一样工作。

您使用的是仅在OpenGL-3中引入的非扩展FBO函数。因此,与FBO扩展函数(以
ARB
结尾)不同,这些函数仅在OpenGL-3上下文中可用。在OpenGL-3中,GL_亮度和GL_ALPHA纹理内部格式已被弃用,在core profile中不可用。它们已被GL_红色纹理格式取代。您可以使用适当编写的着色器或纹理swizzle参数使GL_红色纹理与GL_亮度(swizzle
dst.rgb=texture.r
)或GL_ALPHA(swizzle
dst.a=texture.r
)一样工作。

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

  • GL_RGBA4
  • GL\u RGB5\u A1
  • GL_RGB565
该标准不要求支持渲染到GL_RGBA(适用于您)。不过,许多实现都支持它。添加了对
GL_RGB8
GL_RGBA8
格式作为渲染目标的支持

glu-LUMINANCE
标准不支持作为颜色可渲染格式,我也找不到它的扩展。有些实现可能支持它,但您肯定不能指望它


ES 3.0将
GL_R8
列为颜色可渲染格式。在ES 3.0中,红色/
R
格式取代ES 2.0中的亮度/
ALPHA
格式。因此,如果可以移动到ES 3.0,则支持渲染为单分量纹理格式。

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

  • GL_RGBA4
  • GL\u RGB5\u A1
  • GL_RGB565
该标准不要求支持渲染到GL_RGBA(适用于您)。不过,许多实现都支持它。添加了对
GL_RGB8
GL_RGBA8
格式作为渲染目标的支持

glu-LUMINANCE
标准不支持作为颜色可渲染格式,我也找不到它的扩展。有些实现可能支持它,但您肯定不能指望它


ES 3.0将
GL_R8
列为颜色可渲染格式。在ES 3.0中,红色/
R
格式取代ES 2.0中的亮度/
ALPHA
格式。因此,如果您可以移动到ES 3.0,您就可以支持渲染为单分量纹理格式。

我已通过使用GL_RG_EXT或GL_RED_EXT解决了这个问题

我用GL_RG_EXT或GL_RED_EXT解决了这个问题

这里最大的问题是,
glu亮度
不是一种颜色可渲染格式。是的,它在GL 3中被弃用,但除非您有一个无关紧要的核心配置文件。您仍然可以使用此格式(例如,
glReadPixels(…)
)进行像素传输,并将其用于内部纹理存储,但即使在兼容配置文件中,您也无法将其用作FBO附件。Thx非常感谢您的帮助。我使用OpenGLES2.0,而不是OpenGL3。为什么它仍然发生?它在ES 2.0中也无效。Thx。但是,如果我坚持使用GL_亮度,是否有OpenGL ES2.0的解决方案?不,没有。您需要一个纹理旋转来完成
GL\u亮度
过去的工作。因此,除非您使用明暗器和类似于
GL\u R8
的格式,否则您就不走运了。这里最大的问题是
GL\u亮度
不是一种颜色可渲染格式。是的,它在GL 3中被弃用,但除非您有一个无关紧要的核心配置文件。您仍然可以使用此格式(例如,
glReadPixels(…)
)进行像素传输,并将其用于内部纹理存储,但即使在兼容配置文件中,您也无法将其用作FBO附件。Thx非常感谢您的帮助。我使用OpenGLES2.0,而不是OpenGL3。为什么它仍然发生?它在ES 2.0中也无效。Thx。但是,如果我坚持使用GL_亮度,是否有OpenGL ES2.0的解决方案?不,没有。您需要一个纹理旋转来完成
GL\u亮度
过去的工作。因此,除非您使用着色器和类似于
GL_R8
的格式,否则您就不走运了。ES 2.0具有FBO支持,并且没有
GL_RED
格式或纹理旋转。@RetoKoradi:谢谢。我完全忽略了这一点。请注意opengl-es-2.0标记。ES 2.0具有FBO支持,并且没有
GL_RED
格式或纹理旋转。@RetoKoradi:谢谢。我完全忽略了这一点。谢谢你详细的回答。我仍然无法解决这个问题,因为我必须使用OpenGL ES2.0.thx来获得您的详细答案。我仍然无法解决它,因为我必须使用OpenGL ES2.0。