glcolor3b和glcolor3ub之间的区别

时间:2013-10-24 21:55:51

标签: java opengl lwjgl

我想知道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)

有人知道这是为什么吗?

3 个答案:

答案 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位整数。

glColor3bchar的版本,它是带符号的8位整数。

当被解释为带符号的8位整数时,

255 = 0xFF实际为-1。这就是为什么你因为Two's complement表示而得到黑屏的原因。只需坚持ub版本。