有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java OpenGL ES glReadPixels返回错误的值

首先第一次来这里大家好。 在搜索了包括该网站在内的网络数天后,我未能克服这个问题:

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) glReadPixels在单击(99,0,0)或(91,0,0)时返回

如果框是彩色的(x,0,0255),它返回一个值,就好像它有一个可能值的列表,它们之间有8个空格。(91,99,107..) 将每个读取颜色值“舍入”到最接近的“可能”值的排序


共 (2) 个答案

  1. # 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上找到了解决方案,请告诉我

  2. # 2 楼答案

    正如我在这里所说:

    Java has no signed bytes and this implementation calls for a "GL10.GL_UNSIGNED_BYTE" answer from glReadPixels. the conversion hurts the data returned. (e.g. a 95 red would be returned as 91 or 99).

    由于Java无法处理此转换问题,因此我认为有两种解决方案: 1) 在每两个可能值(一种颜色)和新绝对值之间制作转换映射

    2)使用NDK可能会立即给出精确的颜色值。请记住,我还没有测试过它,决定将NDK与OpenGL结合使用并不总是比Java提供更好的性能