我正在尝试执行OpenGL拣选(即回答"在哪个对象上"用户是否点击了?"问题)。我用谷歌搜索了一下,发现了几种不同的技术,但没有一种是可以的我
- 使用 glReadPixel 检查像素颜色:我正在使用纹理,所以不合适
- 使用 glReadPixel 检查像素 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?
光线投射到场景中并检查碰撞是拾取的首选方法。
如果要使用 glReadPixel 方法,只需将对象渲染到后台缓冲区(将对象的 ID 编码为常量颜色),而无需交换缓冲区。您仍然可以将对象呈现为完全纹理以进行显示。仅当用户单击(并且场景实际更改)时,才使用其对象颜色渲染它们,并且仅在后台缓冲区中不显示它们。
使用 glReadPixel 检查像素颜色:我正在使用纹理,所以它不合适
为什么这不起作用?您可以使用 glReadPixel 来读取 SurfaceTexture 像素颜色,无论媒体源来自相机还是视频文件。
查看MediaDump项目,该项目尝试使用GLSurfaceView将每个视频帧转储到单个图像文件中,您可以对其进行修改以进行进一步处理或将源更改为相机,两者都是可行的。但请注意 setEGLConfigChooser 中的 RGBA 大小设置,它会影响像素读取速度。