OpenGL ES glReadPixels返回错误的值

时间:2011-11-26 08:19:32

标签: java android opengl-es

首先,第一次来这里大家好。 在网上搜索了几天,包括这个网站后,我没能解决这个问题:

public void onDrawFrame(GL10 gl) {

gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

        gl.glMatrixMode(GL10.GL_MODELVIEW);
        gl.glLoadIdentity(); //load identity
        GLU.gluLookAt(gl, 0, -5, -25, 0, 0, 0, 0, 2, 0); //set camera

        if (fingerInput.isClicking()){
            /* Color Picking 4 START */
            gl.glDisable(GL10.GL_TEXTURE_2D); //turn off texturing, lighting and fog
            gl.glDisable(GL10.GL_FOG);
            gl.glDisable(GL10.GL_LIGHTING);

            while (i<squares.size()){ //draw picking colors
                squares.get(i).pickingDraw(gl); //note: picking is the same as draw() only with id colors and not textures
                i++;
            }
            i=0;

            gl.glReadPixels(fingerInput.getStart().x, screen_height-fingerInput.getStart().y, 1, 1, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, pixels); //read what was the color id pressed, store it in 'pixels' (a 4 slots array buffer)

            Log.d("tlog","at coords: ("+(screen_height-fingerInput.getStart().x)+", "+(screen_height-fingerInput.getStart().y)+")");

            for (j=0; j<4; j++){
                RGBA[j] = (int)(pixels.get(j) & 0xff);
                if (RGBA[j] < 0) RGBA[j]+=256; //correcting error caused by java using unsigned bytes and opengl singed bytes 
            }

无论如何,为了拾取目的,每个方块都用独特的颜色绘制(目前绘制3个方块,颜色为99,96和93红色,0为蓝绿色alpha) 单击(99,0,0)或(91,0,0)时,glReadPixels返回。

如果框是彩色的(x,0,0,255),它返回一个值,好像它有一个可能值的列表,它们之间的空格为8。 (91,99,107 ..)有点&#34;四舍五入&#34;每个读取的颜色值最接近&#34;可能&#34;值。

2 个答案:

答案 0 :(得分:1)

几个月前我遇到过类似的问题,但是我使用Bitmap类和getPixel方法来读取各个像素的颜色。作为测试,我使用黑色图像,完全黑色,因此所有像素都应具有值0,但getPixel方法返回值0,6,0,6,0,6 .. 。等等。

如果您查看Android SDK的Google代码页上的此链接,其他人就会遇到与我相同的问题: Bitmap.getPixel error遗憾的是尚未确定。

我不确定它是否与Android上的OpenGL有关,但根据我的经验,后来的SDK版本有时会以某种方式搞乱颜色值。那天唯一有用的就是使用较低的SDK版本。

尝试1.4或1.5上的代码,如果问题消失,请等待后续SDK上的修复。如果它持续存在则是另一个问题。

PS:如果您在以后的SDK上找到解决方案,请告诉我。

答案 1 :(得分:0)

正如我在这里所说:

  

Java没有签名字节,此实现需要glReadPixels的“GL10.GL_UNSIGNED_BYTE”答案。转换会损坏返回的数据。 (例如,95红色将返回91或99)。

由于Java无法处理此转换问题,因此我发现了两个解决方案: 1)在每两个可能的值(一种颜色)和一个新的绝对值之间制作转换图。

2)使用NDK可能会立即提供精确的颜色值。请记住,我还没有对它进行测试,决定在OpenGL上使用NDK并不总能提供比Java更好的性能。

相关问题