我正在尝试实现一个我读过的opengl拣选系统,并且遇到了glReadPixels的问题。基本上,场景中的每个节点都会获得一种独特的颜色,当新的触摸发生时,它会渲染场景,除了用其唯一颜色ID绘制的节点。我试图用存储的颜色ID列表检查输入坐标。
我无法让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 :(得分:1)
allocateDirect
“只是不起作用”。使用allocate
。
对我来说这似乎很奇怪,但分配vs allocateDirect
是我遇到的唯一区别。
同样this post in google groups对我帮助很大。
不过,这个发现是在模拟器(几个不同的版本)上进行的,而不是真正的设备。答案 1 :(得分:0)
将glReadPixels用于经典挑选问题是过度的。请记住,glReadPixels是一个阻塞函数,而openGL主要以异步方式工作。使用glReadPixels意味着必须处理驱动程序队列中的所有命令,这可能会浪费大量时间。