2011-04-22 47 views
1

我想实现一个opengl采摘系统,我读了一下,并与glReadPixels碰到一个问题。基本上,场景中的每个节点都会获得一种独特的颜色,并且当发生新的触摸时,它将渲染场景中的任何东西,除了用其独特的颜色ID绘制的节点。我正在尝试使用存储的颜色标识列表来检查输入坐标。在Android中的glReadPixels的问题

我无法让glReadPixels正常工作。对于像素值,它始终返回0 0 0。我真的很感激任何帮助从它获得正确的像素值。感谢

这里是有关代码

private void handleEvent(MotionEvent event) { 
    int x = (int) event.getX(); 
    int y = (int) event.getY(); 
    int action = event.getAction(); 
    int actionCode = action & MotionEvent.ACTION_MASK; 
    if (actionCode == 0) { 
     // Paint with colorID color 
     mSettings.picking(true); 
     dumpEvent(event); 
     final GL10 gl = mSettings.getGL(); 

     ByteBuffer PixelBuffer = ByteBuffer.allocateDirect(4); 
     PixelBuffer.order(ByteOrder.nativeOrder()); 
     gl. glPixelStorei(gl.GL_UNPACK_ALIGNMENT, 1); 
     gl.glReadPixels(x, y, 1, 1, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, PixelBuffer); 
     byte b[] = new byte[4]; 
     PixelBuffer.get(b); 
     String key = "" + b[0] + b[1] + b[2];  
     // Check for selection 
     mRenderer.processSelection(event, new SGColorI(pixel[0], pixel[1], pixel[2], pixel[3])); 

     log.pl("GL on touchdown", key); 
    } else if (actionCode == 2) { 
     mSettings.picking(false); 
    } 
} 
+0

我有同样的问题。即使深度缓冲区也无法返回任何东西。 – xandy 2011-06-10 05:33:50

回答

1

allocateDirect在这种情况下“是行不通的”。使用allocate

对我来说这似乎很奇怪,但分配vs allocateDirect是我唯一的区别。

另外this post in google groups帮了我很多。

顺便说一句,这个发现是在仿真器(几个不同的版本),而不是真正的设备。

0

glReadPixels用于经典拾音问题的过度使用。请记住glReadPixels是一个阻塞函数,而openGL主要以异步方式工作。使用glReadPixels意味着必须处理驱动程序队列中的所有命令,这可能会浪费大量时间。