5

glcolor3b()との違いは何だろうと思っていましたglcolor3ub()

色を赤に設定するのでglcolor3b(255, 0, 0);はなく、黒に設定しているようです。glcolor3b(48, 160, 64)緑ではなく濃い紫に設定します。glcolor3ub()、ただし、期待どおりに動作します。さらに、と
のドキュメントは、「u」を除いてまったく同じです。glcolor3b()glcolor3ub()

public static void glColor3(u)b(byte red,
              byte green,
              byte blue)

これがなぜなのか誰か知っていますか?

4

3 に答える 3

6

glColor3b()-128から127までの範囲のバイトパラメータを取ります。 0から255glColor3ub()までの範囲の符号なしバイト パラメータを取ります。で 127 より大きい値を使用すると、算術オーバーフローが発生します。glColor3b()

于 2013-10-24T22:07:11.943 に答える
5

もちろん255は黒に設定。それは0xff (または0b11111111 ) で、2 の補数の符号付き 8 ビット数を使用した-1です...

-1は0未満です。これは、すべての色が存在しないと見なされます。署名された色は、ブレンド以外ではあまり意味がありません。簡単に言えば、これがこれら 2 つの関数の違いです。1 つは符号付きで、もう 1 つは符号なしです。

glColor3b (...)関数(符号付き)を使用すると、範囲は-128–127になります(-128は-1.0にマップされ、127は1.0にマップされ、0は中間点です)、

glColor3ub (...)関数 (符号なし)を使用する場合、範囲は0 ~ 255です( 0は0.0にマップされ、255は1.0にマップされます)。

使用する関数に関係なく、 でない限りglColor3f (...)、それらはすべて固定小数点から浮動小数点への単位変換を行います。固定小数点から浮動小数点への正規化中に、整数データ型の範囲は-1.0 (符号付き) / 0 (符号なし) と1.0の間で直接マップされます。uvs. non-は、そのuうちの 1 つが符号なし (より大きな正の範囲) であることを単純に示しています。

于 2013-10-24T22:08:39.453 に答える
2

glColor3ubは C/C++ のバージョンでunsigned char、符号なしの 8 ビット整数です。

glColor3bcharは符号付き 8 ビット整数のバージョンです。

255 = 0xFF は、符号付き 8 ビット整数として解釈されると、実際には -1 です。これが、 2 の補数表現のために黒い画面が表示される理由です。ubバージョンに固執するだけです。

于 2013-10-24T22:07:39.460 に答える