Java glcolor3b和glcolor3ub之间的差异

Java glcolor3b和glcolor3ub之间的差异,java,opengl,lwjgl,Java,Opengl,Lwjgl,我想知道glcolor3b()和glcolor3ub()之间有什么区别 似乎glcolor3b(255,0,0)不会将颜色设置为红色,而是将其设置为黑色glcolor3b(48、160、64)将其设置为深紫色,而不是绿色glcolor3ub(),但工作正常。 此外,除“u”外,和的文档完全相同: 有人知道这是为什么吗?glColor3b()接受范围从-128到127的字节参数。 glColor3ub()接受范围从0到255的无符号字节参数。 将大于127的值与glColor3b()一起使用会导致

我想知道
glcolor3b()
glcolor3ub()
之间有什么区别

似乎
glcolor3b(255,0,0)不会将颜色设置为红色,而是将其设置为黑色<代码>glcolor3b(48、160、64)
将其设置为深紫色,而不是绿色<代码>glcolor3ub(),但工作正常。
此外,除“u”外,和的文档完全相同:

有人知道这是为什么吗?

glColor3b()
接受范围从-128127的字节参数。
glColor3ub()
接受范围从0255的无符号字节参数。
将大于127的值与
glColor3b()
一起使用会导致算术溢出。

glColor3ub
是C/C++中的
无符号字符的版本,即无符号的8位整数

glColor3b
char
的版本,它是一个有符号8位整数


255=0xFF在解释为有符号8位整数时实际上为-1。这就是为什么你会因为表现而得到一个黑屏。只需坚持使用
ub
版本即可。

当然255会将其设置为黑色。即0xff(或0b11111111),即-1使用2的补码有符号8位数字

<强> -1 小于<强> 0 < /强>,这将是所有颜色的缺失。除了混合之外,有符号的颜色真的没有多大意义。简而言之,这就是这两个函数之间的区别,一个是有符号的,另一个是无符号的

当您使用
glColor3b(…)
函数(有符号)时,您的范围是-128–127-128映射到-1.0127映射到1.00是中点)

使用
glColor3ub(…)
函数(un-签名)时,范围为0–2550映射到0.0255映射到1.0


无论您使用哪个函数,除非它是
glColor3f(…)
,否则它们都进行定点到浮点的单位转换。在定点到浮点标准化期间,整数数据类型的范围直接映射到-1.0(有符号)/0(无符号)和1.0之间。与非
u
相比,
u
仅仅表明其中一个是无符号的(更大的正范围)。

顺便说一句,我不会称之为您链接到文档的内容。这基本上就是查看某个东西的函数签名并试图理解它的功能,但它通常不起作用;)下面是这些函数集的外观。我给出的链接是该函数的API文档。该语言的C绑定完全遵循这些文档,Java的绑定对于某些需要“指针”之类的东西的函数略有不同
public static void glColor3(u)b(byte red,
              byte green,
              byte blue)