5

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)

有人知道这是为什么吗?

4

3 回答 3

6

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

于 2013-10-24T22:07:11.943 回答
5

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

-1小于0,您会认为这是没有所有颜色。除了混合之外,签名颜色真的没有多大意义。简而言之,这就是这两个函数之间的区别,一个是有符号的,另一个是无符号的。

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

当您使用glColor3ub (...)函数(符号)时,范围是0–2550映射到0.0255映射到1.0)。

不管你使用哪个函数,除非是glColor3f (...),它们都做定点到浮点单元的转换。在定点到浮点规范化期间,整数数据类型的范围直接映射在-1.0(有符号)/ 0(无符号)和1.0之间。uvs. non-u仅表示其中之一是无符号的(较大的正范围)。

于 2013-10-24T22:08:39.453 回答
2

glColor3ubunsigned charC/C++ 中的版本,即不带符号的 8 位整数。

glColor3bchar有符号 8 位整数的版本。

255 = 0xFF 在解释为带符号的 8 位整数时实际上是 -1。这就是为什么由于二进制补码表示而出现黑屏的原因。只需坚持ub版本。

于 2013-10-24T22:07:39.460 回答