如何在 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;

因为,一旦您开始将颜色值用作 floats,您就希望它们在 0 和 1

之间对齐