我试图在Android上的OpenGL ES中通过TouchEvents返回像素颜色。我创建了2个三角形作为矩形。所以我把显示的图像放在上面。黑色区域不是三角形的一部分。
如果我点击黑色区域,它总是给我正确的数字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);
}
}
答案 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中看到x
和y
描述的位置:
指定从帧缓冲区读取的第一个像素的窗口坐标。此位置是矩形像素块的左下角。
要适应这些不同的坐标系,您必须先将触摸输入的y坐标反转,然后再将其传递给glReadPixels()
。而不是touchYint
,请使用windowHeight - 1 - touchYint
。