Android OpenGL纹理/对象检测

时间:2011-05-20 12:58:39

标签: java android opengl-es rubiks-cube

我正在尝试执行OpenGL选择(即回答“关于哪个对象 用户点击了吗?“问题”。 我用Google搜索并发现了一些不同的技术,但没有一个是可以的 我

  • 用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吗?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

  

用glReadPixels检查像素颜色:我正在使用纹理,所以它不适合

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

查看MediaDump项目,尝试使用GLSurfaceView将每个视频帧转储为单个图像文件,您可以修改它以进行进一步处理或将源更改为相机,两者都可行。但请注意setEGLConfigChooser中的RGBA尺寸设置,它会影响pixels reading speed