java - Android OpenGL 纹理/对象检测

标签 java android opengl-es rubiks-cube

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

相关文章:

ios - 即使在解除分配后,GPUImageFilters 中的某些内容仍保留在内存中

java - Uber API 未经授权访问问题

java.io.IOException : Cannot run program "tskill": CreateProcess error=2, 系统找不到指定的文件

java - 通过单击更改 Android Studio 图像的颜色

android - 检测手机上的向前/向后运动

android - 禁用对编辑文本的自动对焦

android - Glide Gradle和FirebaseUI无法同步

android - 调用 libgdx SpriteBatch begin 和 end 方法的成本是多少倍?

java - 计数词素 - 字符串越界异常

c++ - 安卓 native NDK OpenGL ES : unimplemented API