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

我知道如何计算实际的Alpha值并正确设置混合功能,但是当我尝试向GLubyte RGB三元组中添加第四个值时遇到了障碍,这使我相信该格式根本不支持Alpha。所以我有一个想法,可以将纹理数据从字节手动转换为32位无符号整数,但是我在执行时遇到了麻烦。从书本上看,我似乎觉得内部像素格式GL_UNSIGNED_INT每个像素需要四个32位整数,但是当我通过将0.0-1.0个字节值限制在最大范围内来转换字节时,我的程序将无法启动一个无符号的int。

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

最佳答案

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

多年以来,GL中的内部格式有些令人困惑,您必须要求提供组件的数量,但不需要太多。如今(GL3 +),您必须使用显式调整大小的内部格式,例如GL_RGB8,这省去了大部分的猜测工作。但是,您仍然可以假设驱动程序将用额外的8位填充GL_RGB8,以便每种颜色均以2的幂为边界。因此,GL_RGB8具有与GL_RGBA8相同的存储要求,并且两者之间的唯一区别是GL_RGB8具有所有不透明像素。

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

关于GL_UNSIGNED_INT_8_8_8_8,如果您尝试上传RGBA图像,则实际上与GL_UNSIGNED_BYTE略有不同。这就是所谓的打包数据类型。与GL_UNSIGNED_INT相同的封装中包含4个组件,每个组件均为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字节(默认值为4),如下所示:

glPixelStorei (GL_UNPACK_ALIGNMENT, 1);


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

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

10-11 22:46
查看更多