Android OpenGL ES - 来自glReadPixels的非常奇怪的像素颜色 - 切换图像?

时间:2014-06-18 13:12:41

标签: android graphics opengl-es shader

我试图在Android上的OpenGL ES中通过TouchEvents返回像素颜色。我创建了2个三角形作为矩形。所以我把显示的图像放在上面。黑色区域不是三角形的一部分。

enter image description here

如果我点击黑色区域,它总是给我正确的数字0 0 0 -1(黑色)。如果我点击白色区域,它也总是给我正确的数字-1 -1 -1 -1(白色)。但是当我点击绿色矩形时,它会给我0 0 0 -1(黑色)。之后,我点击他旁边的黑色矩形,它给了我邻居的颜色(绿色)。

图片在“背景”中切换,但我不知道这是怎么回事

使用此Tut:http://androidblog.reindustries.com/a-real-open-gl-es-2-0-2d-tutorial-part-1/

我的拾色代码:

public void onDrawFrame(GL10 gl) {

if (clicked) {
            gl.glDisable(GL10.GL_TEXTURE_2D);
            gl.glDisable(GL10.GL_FOG);
            gl.glDisable(GL10.GL_BLEND);

            ByteBuffer ss = ByteBuffer.allocate(4);
            ss.order(ByteOrder.nativeOrder());
            gl.glFlush();
            gl.glReadPixels(touchXint, touchYint, 1, 1, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, ss);

            byte b[] = new byte[4];
            ss.get(b);
            String key = "" + b[0] + " " + b[1] + " " + b[2] + " " + b[3];
            Log.d("Color: ", key);
            clicked = false;
            ss.rewind();

            gl.glEnable(GL10.GL_TEXTURE_2D);
            gl.glEnable(GL10.GL_FOG);
            gl.glEnable(GL10.GL_BLEND);


        }
}

2 个答案:

答案 0 :(得分:1)

这不是真正的答案,为什么你的问题出现了,但看起来你的X坐标是倒置的。我的意思是,水平0与screenWidth交换。只是为了确认它你可以尝试像

这样的东西
gl.glReadPixels(screenWidth - touchXint, touchYint, 1, 1, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, ss);

如果有效,那么你应该在获取touchXint坐标时搜索问题。

编辑:

在这种情况下,屏幕水平定向,因此水平轴为Y.OpenGL坐标系和Android坐标系中的Y轴方向反转。因此,要获得glReadPixels调用的正确Y坐标,需要应用以下转换:y =(screenHeight-touchYint)。

答案 1 :(得分:1)

您的坐标系似乎有问题。在许多窗口/ UI系统中,包括Android,您作为事件的一部分接收的坐标相对于窗口的左上角。

另一方面,OpenGL用于指定glReadPixels()的像素矩形的窗口坐标系统的原点位于左下角。您可以在documentation中看到xy描述的位置:

  

指定从帧缓冲区读取的第一个像素的窗口坐标。此位置是矩形像素块的左下角。

要适应这些不同的坐标系,您必须先将触摸输入的y坐标反转,然后再将其传递给glReadPixels()。而不是touchYint,请使用windowHeight - 1 - touchYint