Выбор цвета на Android - ошибки округления glReadPixels
Я использую выбор цвета в OpenGLES на 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
может быть, мой метод расчета не является правильным? У кого-нибудь есть идеи, как избежать этих отклонений?
2 ответа
Например, если вы установите красный float(31 / 255), я думаю, что преобразование будет таким.
31 (0001_1111) преобразуется в 3(0000_0011), если цветовой формат RGB565(по умолчанию)
тогда мы используем glReadPixels(), чтобы получить значение
3(0000_0011) преобразуется в 24(0001_1000)
Одним словом, если вы установите 31 для красного цвета, вы получите 24 в конце.
Ключом к устранению ошибки округления является метод преобразования из RGB565 в RGB88, который вы не делали.
Вы можете попробовать. Удачи.
Java-байты подписаны.
-28 = 0xe4 в байте со знаком = 228 десятичных, если вы рассматриваете 0xe4 как беззнаковый.
228/255 = 0,894 в поплавке