我在使用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。有人有什么有用的建议来解决这个问题吗?
在ES 2.0中保证作为彩色FBO附件的唯一格式是,根据规范文档中的表4.5:
-
GL_RGBA4
-
GL_RGB5_A1
-
GL_RGB565
支持GL_RGBA渲染,这对你有用,不是标准所要求的。但是,许多实现都支持它。OES_rgb8_rgba8扩展增加了对GL_RGB8
和GL_RGBA8
格式作为渲染目标的支持。
GL_LUMINANCE
不支持作为标准的可颜色渲染格式,我也找不到它的扩展。有些实现可能会支持它,但你当然不能指望它。
ES 3.0将GL_R8
列为可颜色渲染的格式。在ES 3.0中,RED
/R
格式取代了ES 2.0中的LUMINANCE
/ALPHA
格式。因此,如果你可以移动到ES 3.0,你就可以支持渲染到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
)一样工作。
我通过使用GL_RG_EXT或GL_RED_EXT来解决。