0

我正在尝试执行 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?

4

2 回答 2

3

实际上,将光线投射到场景中并检查碰撞是拾取的首选方法。

如果您想使用 glReadPixels 方法,您可以将对象渲染到后台缓冲区(对象的 ID 编码为常量颜色)而不交换缓冲区。您仍然可以渲染您的对象完全纹理化以供显示。您仅在用户单击(并且场景实际更改)时使用其对象颜色渲染它们,并且仅在不显示它们的情况下将它们渲染到后台缓冲区。

于 2011-05-20T14:00:17.430 回答
0

使用 glReadPixels 检查像素颜色:我正在使用纹理,因此不适合

为什么这不起作用?无论媒体源是来自相机还是视频文件,您都可以使用glReadPixels来读取SurfaceTexture像素颜色。

查看MediaDump项目,该项目尝试使用 GLSurfaceView 将每个视频帧转储到单个图像文件中,您可以对其进行修改以进行进一步处理或将源更改为相机,两者都是可行的。但请注意setEGLConfigChooser中的 RGBA 大小设置,它会影响像素读取速度

于 2013-06-15T19:10:11.633 回答