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

标签 c++ opengl

我正在尝试创建要显示的纹理。我有 wxh 数组,其中每个像素是 1 个字节。我看过Can I use a grayscale image with the OpenGL glTexImage2D function?但我不确定目前如何实现。看起来 GL_LUMINANCE 已被弃用,我需要独立处理单个 channel 。我不知道应该如何尝试这个

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 个颜色 channel ,则可以使用格式 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 )以从红色 channel 读取绿色和蓝色:

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 的倍数的大小。如果图像数据紧密包装,则必须更改对齐方式。


如果你使用shader程序,那么Swizzling也可以实现同样的效果。 。例如:

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

关于c++ - 如何显示带有 opengl 纹理的灰度图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59547366/

相关文章:

C++ 语法错误

opengl - GLSL 采样器如何确定纹理的缩小程度以及 mipmap 级别?

c++ - 将枚举传递给另一个文件? C++

c++ - 是否可以在派生类中选择性地定义类型

c++ - 错误 C2059 : syntax error: 'constant' from struct member declarations

python - 如何使用一片 QSqlQueryModel?

c++ - File V/S 内存存储网络数据

c++ - OpenGL:两个顶点数组 + 两个索引数组

c++ - 如何将 OpenGL 加载到 Visual Studio 2012

c++ - MinGW 找不到 inttypes.h