Я использую выбор цвета в открытых окнах на Android и вычисляю цветовой ключ, чтобы сравнить его со значениями, которые я получаю из 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));
}
Сначала значение с плавающей запятой преобразуется в intvalue, а затем преобразуется в байт.Значения с плавающей точкой описывают цветовые каналы красный, зеленый, синий (от 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
может быть, мой метод расчета не правильный?У кого-нибудь есть идеи, как избежать этих отклонений?