如何在Android上使用openGL正确读取颜色? (颜色采摘)

时间:2017-03-18 18:02:35

标签: android colors opengl-es opengl-es-2.0

我的问题有点奇怪。我已经阅读了很多文章,并且我确信我的代码应该返回范围为0到1的3(或4个基于设置)浮点值。我应该将它们转换为RGB。 BUT

gl.glReadPixels(screenWidth - this.x, this.y, 1, 1, GL10.GL_RGB, GL10.GL_UNSIGNED_BYTE, pixelBuffer);

byte [] bb = new byte [3];

此代码返回类似

的值
{ -9, -7, -7 }

我不知道如何从中获取RGB颜色。我尝试过多次,分割等等。我的代码与99%的代码示例完全相同,但我仍然收到了非常奇怪的值。

整个目标是在屏幕上选择触摸点的颜色

// UPDATE

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;

例如,当我选择"变量r,g,b的红色值,其中:-1.0,36.0,0.0

1 个答案:

答案 0 :(得分:1)

正如您在代码中看到的那样,您尝试检索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之间对齐