Anima
Anima

Reputation: 359

Rendering a grayscale texture with glBlitFramebuffer

I want to render a texture to the screen. For RGB and RGBA images the following code works fine:

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);

This works fine and the image is rendered as intended. But if I want to render a grayscale image I already tried to swizzle:

...
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);

But the rendered texture is always red. Is there something I'm doing wrong?

Upvotes: 0

Views: 233

Answers (1)

Rabbid76
Rabbid76

Reputation: 210968

Swizzles are applied to the components of a texel before they are returned to the shader. This means that it will be applied to the texels when the texture is looked up (e.g. view texture). However, glBlitFramebuffer is a copy operation. Swizzles are not applied to copy operations.

Upvotes: 1

Related Questions