【问题标题】:OpenGL ES glReadPixels returns wrong valuesOpenGL ES glReadPixels 返回错误值
【发布时间】:2013-01-27 17:02:47
【问题描述】:

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

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 红色,0s 为蓝绿色 alpha) glReadPixels 在单击 (99,0,0) 或 (91,0,0) 时返回。

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

【问题讨论】:

    标签: java android opengl-es


    【解决方案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.5 中重新创建了整个项目,不幸的是它没有任何改变。
    • 好的,进展.. Java 没有带符号的字节,这个实现需要来自 glReadPixels 的“GL10.GL_UNSIGNED_BYTE”回答。转换会损害返回的数据。 (例如,95 红色将返回为 91 或 99)。新问题是,为什么我不能使用 GL10.GL_FLOAT 标志?,这样的尝试只返回 0 值。有人在另一篇文章中写道,OpenGL es1.1 只允许两种状态,它们都不返回浮点数。人们如何从 OGLES1.1、android 上的 glReadPixels 中获得准确的读数
    • 你好,它在android中坏了吗?你能找到解决办法吗?
    【解决方案2】:

    正如我在这里所说的:

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

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

    2) 使用 NDK 可能会立即给出精确的颜色值。请记住,我尚未对其进行测试,并且决定将 NDK 与 OpenGL 一起使用并不总是比 Java 提供更好的性能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多