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

Posted

技术标签:

【中文标题】如何显示带有opengl纹理的灰度图像【英文标题】:How do I display a grayscale image with opengl texture 【发布时间】:2019-12-31 18:17:23 【问题描述】:

我正在尝试创建要显示的纹理。我有 wxh 数组,其中每个像素为 1 个字节。我看过Can I use a grayscale image with the OpenGL glTexImage2D function?,但我不确定目前如何实现它。看起来 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】:

如果您有一个具有 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;

【讨论】:

以上是关于如何显示带有opengl纹理的灰度图像的主要内容,如果未能解决你的问题,请参考以下文章

将灰度 OpenCV 图像传递给 OpenGL 纹理

为啥没有实现 OpenGL 灰度纹理性能增益?

OpenGL灰度纹理作为浮动错误格式

OpenGL:当尺寸不能被 4 整除时,灰度纹理数据布局不匹配

纹理特征提取方法:LBP, 灰度共生矩阵

matlab中如何将灰度图转化为二值黑白图像?敬请各位大侠指点!