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