使用 glBlitFramebuffer 渲染灰度纹理

Rendering a grayscale texture with glBlitFramebuffer

我想在屏幕上渲染纹理。对于 RGB 和 RGBA 图像 以下代码工作正常:

GLuint texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image_data); // or GL_RGBA for RGBA images
glGenerateMipmap(GL_TEXTURE_2D);

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture);
GLuint fboId = 0;
glGenFramebuffers(1, &fboId);
glBindFramebuffer(GL_READ_FRAMEBUFFER, fboId);
glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);

glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
glBlitFramebuffer(0, 0, width, height, 0, height, width, 0,  GL_COLOR_BUFFER_BIT, GL_NEAREST);

效果很好,图像按预期呈现。 但是,如果我想渲染灰度图像,我已经尝试过调配:

...
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RED, GL_UNSIGNED_BYTE, image_data);
GLint swizzleMask[] = {GL_RED, GL_RED, GL_RED, GL_RED};
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);

但是渲染出来的贴图总是红色的。我做错了什么吗?

Swizzles 在纹理元素的组件返回到着色器之前应用于它们。这意味着它将在查找纹理时应用于纹素(例如视图 texture)。但是,glBlitFramebuffer 是一个复制操作。调配不适用于复制操作。