如何显示具有 opengl 纹理的灰度图像

How do I display a grayscale image with opengl texture

本文关键字:opengl 纹理 灰度图像 何显示 显示      更新时间:2023-10-16

我正在尝试创建一个要显示的纹理。我有 wxh 数组,其中每个像素是 1 个字节。我看过我可以将灰度图像与OpenGL glTexImage2D功能一起使用吗?但我不确定目前如何实施它。看起来GL_LUMINANCE已被弃用,我需要独立处理单通道.我不确定我应该如何尝试这个

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image_width, image_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image_data);

我尝试将GL_RGBA更改为其他格式,例如GL_R https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexImage2D.xhtml。我仍然无法显示图像。有人有什么建议吗?

如果您有一个具有 1 个颜色通道的源纹理,则可以使用格式GL_RED和基本内部格式GL_RED

glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, image_width, image_height,
0, GL_RED, GL_UNSIGNED_BYTE, image_data);

GL_TEXTURE_SWIZZLE_GGL_TEXTURE_SWIZZLE_B设置纹理参数(见glTexParameteri(,以从红色通道读取绿色和蓝色:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, GL_RED);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, GL_RED);

请注意,当图像加载到纹理对象时,可能GL_UNPACK_ALIGNMENT必须设置为 1:

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, ...);

默认情况下,参数为 4。这意味着假定图像的每一行都与 4 的倍数对齐。如果图像数据紧密打包,则必须更改对齐方式。


如果您使用着色器程序,那么通过 Swizzling 也可以实现相同的效果。 例如:

vec3 color = texture(u_texture, uv).rrr;