我正在尝试执行 OpenGL 拾取(即回答“在哪个对象上 用户点击了吗?”问题)。 我用谷歌搜索并找到了一些不同的技术,但没有一个适合 我
- 使用 glReadPixels 检查像素颜色:我正在使用纹理,所以 不适合
- 使用 glReadPixels 检查像素 alpha:我使用 alpha 混合所以不合适
- 构建射线并检查碰撞:哎呀!我宁愿不去 进入那个...
- glRenderMode(GL_SELECT):OpenGL ES 不支持
我一直在考虑检查模板缓冲区值。我不 将其用于通常用途,因此我的每个对象都可以写入其 ID 其中(我的对象少于 255 个)。 问题是我无法读取模板缓冲区值 使用 glReadPixels。 RGBA 没问题,但我无法让它适用于 模板值。 这是我的代码:
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?
最佳答案
实际上,将光线转换到场景中并检查碰撞是选择的拾取方法。
如果您想使用 glReadPixels 方法,您可以将对象渲染到后台缓冲区(对象的 ID 编码为常量颜色),而无需交换缓冲区。您仍然可以将对象渲染为完全纹理化以供显示。仅当用户单击(并且场景实际更改)时,才用其对象颜色渲染它们,并且仅将它们渲染到后台缓冲区中而不显示它们。
关于java - Android OpenGL 纹理/对象检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6072231/