其他分享
首页 > 其他分享> > android上的颜色选择 – glReadPixels舍入错误

android上的颜色选择 – glReadPixels舍入错误

作者:互联网

我在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的方法,你没有这样做.

你可以尝试一下.祝好运.

标签:android,opengl-es,picking,color-picker
来源: https://codeday.me/bug/20190630/1341539.html