我正在尝试执行 OpenGL 拾取(即回答“用户单击了哪个对象?”问题)。我用谷歌搜索并发现了一些不同的技术,但对我来说没有一个可以
- 使用 glReadPixels 检查像素颜色:我正在使用纹理,因此不适合
- 使用 glReadPixels 检查像素 alpha:我使用 alpha 进行混合,因此不适合
- 建立一条射线并检查碰撞:哎呀!,我不想进入那个......
- glRenderMode(GL_SELECT):在 OpenGL ES 中不支持
我一直在考虑检查模板缓冲区的值。我不将它用于通常的目的,因此我的每个对象都可以在其中写入其 ID(我的对象少于 255 个)。问题是我无法使用 glReadPixels 读取模板缓冲区值。RGBA 没问题,但我无法让它适用于 Stencil 值。这是我的代码:
ByteBuffer bb = ByteBuffer.allocateDirect(4);
bb.order(ByteOrder.nativeOrder());
bb.position(0);
glReadPixels(x, y, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, bb);
Log.d(TAG, "color is R"+ bb.get() + " G" + bb.get() + " B" +
bb.get() + " A" + bb.get());
// ---> This is working fine, I can read RGBA correctly
bb.position(0);
glReadPixels(x, y, 1, 1, GL11ExtensionPack.GL_STENCIL_INDEX,
GL_UNSIGNED_BYTE, bb);
Log.d(TAG, "stencil is "+ bb.get());
// ---> This is not working, looks like it isn't doing anything
因为我仍然在缓冲区中获得 R 值...
我确定模板缓冲区已启动并正在运行,因为我设法将它用于一些剪辑。使用 setEGLConfigChooser(8, 8, 8, 8, 8, 8) 将其配置为 8 位。
是平台的限制还是我的做法不对?(我没有找到任何读取模板缓冲区的实际示例)
另外,任何人都可以建议除了使用模板缓冲区之外是否有任何方法来检测用户单击的对象ID?