glcolor3b和glcolor3ub有什么区别?

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)

有人知道这是为什么吗?


1
顺便说一下,我不认为你链接的那个东西算是文档。那只是看函数签名然后试着理解它的作用,通常不起作用的;) 这才是真正的文档,适用于这些函数集合。 - Andon M. Coleman
1
我给出的链接是该函数的API文档。语言的C绑定按照这些文件逐字逐句地进行,Java的绑定在某些需要“指针”之类的函数方面略有不同。 - Andon M. Coleman
3个回答

6

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


5
当然,255 将其设置为黑色。这是 0xff(或 0b11111111),使用二进制补码有符号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 之间。 u vs. 非-u 只是表示其中一个是无符号的(较大的正数范围)。

2

glColor3ub是C/C++中用于unsigned char的版本,它是一个没有符号的8位整数。

glColor3b是用于char的版本,它是一个带符号的8位整数。

当被解释为带符号的8位整数时,255 = 0xFF实际上是-1。这就是为什么由于二进制补码表示法而导致屏幕变黑。因此,请使用ub版本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接