我在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));
}
首先,浮点值转换为intvalue然后castet到byte.浮点值描述颜色系列红绿蓝(从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
也许我的计算方法不正确?有没有人知道如何避免这些偏差?
解决方法:
例如
如果设置红色浮点数(31/255),我认为转换是这样的.
如果颜色格式为RGB565(默认),则31(0001_1111)转换为3(0000_0011)
然后我们使用glReadPixels()来获取值
3(0000_0011)转换为24(0001_1000)
总之,如果你设置31为红色,你最终会得到24.
消除舍入误差的关键是从RGB565转换为RGB88的方法,你没有这样做.
你可以尝试一下.祝好运.