1

我正在尝试实现一个我读过的 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);
    }
}
4

2 回答 2

1

allocateDirect在这种情况下,“只是不起作用”。使用allocate.

这对我来说似乎很奇怪,但 allocate vsallocateDirect是我来的唯一区别。

谷歌群组中的这篇文章也帮助了我很多。

顺便说一句,这个发现是在模拟器(几个不同的版本)上做出的,而不是真实的设备。

于 2012-03-19T01:50:23.423 回答
0

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

于 2013-11-13T16:35:20.417 回答