gpt4 book ai didi

c++ - 将 GLubyte* 转换为 GLuint* 用于 alpha 纹理 Opengl 3.0/c++/Win32

转载 作者:太空宇宙 更新时间:2023-11-04 16:10:46 26 4
gpt4 key购买 nike

我的目标是使纹理的像素值 100% 透明(如果它与设置的 RGB 颜色完全匹配)。我的程序使用 24 位 .bmp 图像,我知道它不包含第四个 channel (除了填充),所以我一直在尝试想出一个好方法来促进添加 alpha channel 以执行基本透明度。

我了解如何计算实际的 alpha 值并正确设置混合函数,但是当我尝试向 GLubyte RGB 三元组添加第四个值时遇到了障碍,这让我相信该格式根本不支持α。所以我有一个想法将纹理数据从字节手动转换为 32 位无符号整数,但我在执行时遇到了麻烦。在我看来(通过看书)内部像素格式 GL_UNSIGNED_INT 每个像素将采用四个 32 位整数,但是当我通过将 0.0-1.0 字节值钳位到最大范围来转换字节时,我的程序不会启动一个无符号整数。

我不想得到答案,但我真的很感激能朝着正确的方向前进。我是否在正确的轨道上转换为每个像素 4 个整数,或者是否有可能使 alpha 处理我忽略的字节数据?我考虑过使用 GL_UNSIGNED_INT_8888 格式,但我希望尽可能避免移位。

最佳答案

GL_UNSIGNED_INT 不是“内部像素格式”。那实际上就是像素传输数据类型。

多年来,GL 中的内部格式一直是个谜,您必须请求组件的数量而不是其他。如今 (GL3+),您必须使用明确大小的内部格式,例如 GL_RGB8,这就排除了大部分猜测。但是,您仍然可以假设 GL_RGB8 将由驱动程序填充额外的 8 位,以便每种颜色都从 2 的幂边界开始。 GL_RGB8 因此具有与 GL_RGBA8 相同的存储要求,两者之间的唯一区别是 GL_RGB8 具有所有不透明像素。

当您使用 GL_UNSIGNED_INT 作为像素传输的数据类型时,这意味着 GL 会将您的输入图像数据解释为具有 32 位(无符号)的每个颜色分量(12 字节每像素)。您不希望这样,您目前每个像素有 3 个无符号 8 位分量,因此 GL_UNSIGNED_BYTE 是合适的(每个像素 3 个字节)。 添加第 4 个 组件不会改变单个组件的大小。

关于 GL_UNSIGNED_INT_8_8_8_8,如果您尝试上传 RGBA 图片,那实际上与 GL_UNSIGNED_BYTE 略有不同。这就是所谓的打包数据类型; 4 个组件被打包到与 GL_UNSIGNED_INT 相同的封装中,每个组件都是 8 位。还有 GL_UNSIGNED_INT_8_8_8_8_REV,它更有用 - 它告诉 GL 在像素传输期间反转颜色分量,如果您仅将 GL_UNSIGNED_BYTE 指定为数据类型。 GL_UNSIGNED_INT_8_8_8_8[_REV] 解决了 CPU 字节顺序问题,在小端 CPU 上 GL_UNSIGNED_INT_8_8_8_8_REV 等同于 GL_UNSIGNED_BYTE


请记住,GL 期望图像的每一行都从 4 字节边界开始。

如果您有一个每像素 24 位的图像,其宽度不能被 4 整除,那么您的数据将错位并且 GL 将错误地解压缩它。要解决这个问题,您可以将解压对齐方式设置为 1-byte(默认为 4),如下所示:

glPixelStorei (GL_UNPACK_ALIGNMENT, 1);

.bmp 文件格式已经填充了每一行的末尾以满足 4 字节对齐,这只是我想指出的完整性。

关于c++ - 将 GLubyte* 转换为 GLuint* 用于 alpha 纹理 Opengl 3.0/c++/Win32,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28923678/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com