如何在 Android 上使用 openGL 正确读取颜色? (颜色选择)
How to properly read color using openGL on Android ? (color picking)
我的问题有点奇怪。我读过很多文章,我确信我的代码应该 return 我的 3(或 4,基于设置)浮点值在 0 到 1 范围内。比我应该将它们转换为 RGB。但是
gl.glReadPixels(screenWidth - this.x, this.y, 1, 1, GL10.GL_RGB, GL10.GL_UNSIGNED_BYTE, pixelBuffer);
字节[] bb = 新字节[3];
此代码 returns 值像这样
{ -9, -7, -7 }
我不知道如何从中获取 RGB 颜色。我试过乘法、除法等等。我的代码与代码中 99% 的示例完全相同,但我仍然收到非常奇怪的值。
整个目标是选择屏幕上触摸点的颜色
//更新
ByteBuffer pixelBuffer = ByteBuffer.allocateDirect(3);
pixelBuffer.order(ByteOrder.nativeOrder());
gl.glReadPixels(screenWidth - this.x, this.y, 1, 1, GL10.GL_RGB, GL10.GL_UNSIGNED_BYTE, pixelBuffer);
byte[] bb = new byte[3];
pixelBuffer.get(bb);
String key = bb[0] + " " + bb[1] + " " + bb[2];
Log.d("KOLOR", key);
String colorName = "";
float r = (float)pixelBuffer.get(0);
float g = (float)pixelBuffer.get(1);
float b = (float)pixelBuffer.get(2);
takeScreenshot = false;
例如,当我 "picked" 变量 r、g、b 的红色值时:-1.0、36.0、0.0
如您在代码中所见,您尝试检索 UNSIGNED BYTE
:
GL10.GL_UNSIGNED_BYTE
然后将其分配给:一个字节(-array)。从你的结果我可以看出,这个字节不是无符号的。
当您将 245 之类的值分配给有符号字节时会发生什么?它的二进制值被解释为带符号的数字,最高位是符号,因此如果我没记错的话,无符号字节上下文中的 {-9, -7, -7}
应该是 {245,247,247}
。
在Java中,所有原始整数类型都是有符号的,没有办法解决。
所以您可能想要做的是创建包含(正确的)整数值的第二个数组:
int[] ib = new int[3];
for(int i=0; i<3; i++)
ib[i] = (int)((int)bb[i] & 0xff);
然后输出那个结果。
String key = ib[0] + " " + ib[1] + " " + ib[2];
此外,您应该更改那部分代码:
float r = (float)pixelBuffer.get(0);
float g = (float)pixelBuffer.get(1);
float b = (float)pixelBuffer.get(2);
到
float r = ib[0]/255.0f;
float g = ib[1]/255.0f;
float b = ib[2]/255.0f;
因为,一旦您开始将颜色值用作 float
s,您就希望它们在 0 和 1
之间对齐
我的问题有点奇怪。我读过很多文章,我确信我的代码应该 return 我的 3(或 4,基于设置)浮点值在 0 到 1 范围内。比我应该将它们转换为 RGB。但是
gl.glReadPixels(screenWidth - this.x, this.y, 1, 1, GL10.GL_RGB, GL10.GL_UNSIGNED_BYTE, pixelBuffer);
字节[] bb = 新字节[3];
此代码 returns 值像这样
{ -9, -7, -7 }
我不知道如何从中获取 RGB 颜色。我试过乘法、除法等等。我的代码与代码中 99% 的示例完全相同,但我仍然收到非常奇怪的值。
整个目标是选择屏幕上触摸点的颜色
//更新
ByteBuffer pixelBuffer = ByteBuffer.allocateDirect(3);
pixelBuffer.order(ByteOrder.nativeOrder());
gl.glReadPixels(screenWidth - this.x, this.y, 1, 1, GL10.GL_RGB, GL10.GL_UNSIGNED_BYTE, pixelBuffer);
byte[] bb = new byte[3];
pixelBuffer.get(bb);
String key = bb[0] + " " + bb[1] + " " + bb[2];
Log.d("KOLOR", key);
String colorName = "";
float r = (float)pixelBuffer.get(0);
float g = (float)pixelBuffer.get(1);
float b = (float)pixelBuffer.get(2);
takeScreenshot = false;
例如,当我 "picked" 变量 r、g、b 的红色值时:-1.0、36.0、0.0
如您在代码中所见,您尝试检索 UNSIGNED BYTE
:
GL10.GL_UNSIGNED_BYTE
然后将其分配给:一个字节(-array)。从你的结果我可以看出,这个字节不是无符号的。
当您将 245 之类的值分配给有符号字节时会发生什么?它的二进制值被解释为带符号的数字,最高位是符号,因此如果我没记错的话,无符号字节上下文中的 {-9, -7, -7}
应该是 {245,247,247}
。
在Java中,所有原始整数类型都是有符号的,没有办法解决。
所以您可能想要做的是创建包含(正确的)整数值的第二个数组:
int[] ib = new int[3];
for(int i=0; i<3; i++)
ib[i] = (int)((int)bb[i] & 0xff);
然后输出那个结果。
String key = ib[0] + " " + ib[1] + " " + ib[2];
此外,您应该更改那部分代码:
float r = (float)pixelBuffer.get(0);
float g = (float)pixelBuffer.get(1);
float b = (float)pixelBuffer.get(2);
到
float r = ib[0]/255.0f;
float g = ib[1]/255.0f;
float b = ib[2]/255.0f;
因为,一旦您开始将颜色值用作 float
s,您就希望它们在 0 和 1