4

Androidのopengl esでカラーピッキングを使用しており、カラーキーを計算してglReadPixelsから取得した値と比較しています:

ByteBuffer PixelBuffer = ByteBuffer.allocateDirect(4);
PixelBuffer.order(ByteOrder.nativeOrder());
gl.glReadPixels(x, y, 1, 1, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, PixelBuffer);
byte b[] = new byte[4];
PixelBuffer.get(b);
String key = "" + b[0] + b[1] + b[2];

このキーは、次の方法で任意の色に対して手動で計算できます。

public static byte floatToByteValue(float f) {
    return (byte) ((int) (f * 255f));
}

最初に float 値が intvalue に変換され、次にキャストが byte に変換されます。float 値は、カラーチャネルの赤、緑、青 (0.0f から 1.0f まで) を表します。例: 0.0f は 255 (現在は整数) に変換され、次に 255 からバイトで -1 に変換されます。

これは問題なく動作しますが、opengl では丸めエラーが発生することがあります。例:

0.895 -> -28  and opengl returns -27
0.897 -> -28  and opengl returns -27
0.898 -> -28  and opengl returns -27
0.8985 -> -27 and opengl returns -27
0.899 -> -27  and opengl returns -26
0.9 -> -27    and opengl returns -26
0.91 -> -24   and opengl returns -24

私の計算方法が間違っているのでしょうか?これらの逸脱を回避する方法を知っている人はいますか?

4

2 に答える 2

2

例えば赤のfloat(31/255)を設定するとこんな感じの変形になると思います。

カラーフォーマットがRGB565(デフォルト)の場合、31(0001_1111)は3(0000_0011)に変換されます

次に、 glReadPixels() を使用して値を取得します

3(0000_0011) は 24(0001_1000) に変換されます

つまり、赤色に 31 を設定すると、最終的には 24 になります。

丸め誤差をなくす鍵は、RGB565 から RGB88 に変換する方法です。

お試しいただけます。幸運を。

于 2011-10-15T11:59:05.183 に答える
1

Javaバイトは署名されています。

-28=0xe4を符号なしバイトとして扱う場合は10進数で228=0xe4。
228/255 = 0.894 in float

于 2011-01-12T20:56:54.033 に答える