我想知道glcolor3b()
和glcolor3ub()
之间的区别。
glcolor3b(255, 0, 0);
似乎没有将颜色设置为红色,而是将其设置为黑色。 glcolor3b(48, 160, 64)
将其设置为深紫色,而不是绿色。 glcolor3ub()
但是按预期工作
此外,glcolor3b()
和glcolor3ub()
的文档完全相同,但“u”除外:
public static void glColor3(u)b(byte red,
byte green,
byte blue)
有人知道这是为什么吗?
答案 0 :(得分:6)
glColor3b()
采用字节参数,范围从 -128 到 127 。
glColor3ub()
采用无符号字节参数,范围从 0 到 255 。
对glColor3b()
使用大于127的值会导致算术溢出。
答案 1 :(得分:5)
当然 255 将其设置为黑色。即 0xff (或 0b11111111 ), -1 ,使用2的补码有符号8位数。 ..
-1 小于 0 ,您认为缺少所有颜色。签名的颜色在混合之外真的没有多大意义。简而言之,这就是这两个函数之间的区别,一个是有符号的,另一个是无符号的。
当您使用glColor3b (...)
功能(已签名)时,您的范围 -128-127 ( -128 地图 -1.0 和 127 映射到 1.0 , 0 是中点),
当您使用glColor3ub (...)
功能(联合 -signed)时,范围 0-255 ( 0 映射到 0.0 , 255 映射到 1.0 强>)。
无论您使用哪个函数,除非它是glColor3f (...)
,它们都会进行定点到浮点单位转换。在定点到浮点归一化期间,整数数据类型的范围直接映射在 -1.0 (带符号)/ 0 (无符号)和 1.0之间即可。 u
与非u
只表示其中一个是无符号的(较大的正范围)。
答案 2 :(得分:2)
glColor3ub
是C / C ++中unsigned char
的版本,是一个没有符号的8位整数。
glColor3b
是char
的版本,它是带符号的8位整数。
255 = 0xFF实际为-1。这就是为什么你因为Two's complement表示而得到黑屏的原因。只需坚持ub
版本。