4

使用 Android OpenGL ES 1.1 (HTC Desire)...

我一般遇到的问题是这样的:

我在复杂的场景中渲染了各种 3D 对象。我想检查用户是否单击了特定对象。该对象可能被部分隐藏,因此可能在场景中显示为几乎任何形状。如果用户单击场景中可见的对象的一部分,我只想允许“选择”对象。这意味着我不能对对象交集使用基于矢量的计算,因为这些计算不能轻易考虑到对象的隐藏区域。

于是我想出了一个主意……

我设置了模板缓冲区,以便在对象可见的任何地方,模板缓冲区都填充 1,而模板缓冲区中的其他任何地方都为 0。当用户单击场景中的特定像素时,我只需要检查模板缓冲区即可查看它是否包含 1 或 0,指示对象是否被单击。

这在 PC 上完美运行,但在 Android OpenGL ES 1.1 上,我似乎无法使用 glReadPixels() 从模板缓冲区读取数据,因为不支持 GL_STENCIL_INDEX。

有谁知道是否有办法从模板缓冲区中读取这个 0/1?或者谁能​​想到一个更好的算法来确定我的对象是否被点击?

非常感谢

4

1 回答 1

1

您可以使用颜色缓冲区实现相同的算法。

创建一个帧缓冲区。将场景渲染到其中,但用不同的颜色绘制每个对象。颜色不必与对象的实际颜色相同,因为您在帧缓冲区中绘制的不是眼睛,而是鼠标查找。绘制完整个场景后,使用 glReadPixels 读取像素。当您从鼠标事件中获取鼠标坐标时,请在像素图中查找它们。您找到的颜色可以指向鼠标当前所在的对象。

使用模板缓冲区可能更有效,但在 OpenGL ES 中似乎不可能将模板缓冲区读入内存。另一方面,这种方法的优点是您不会像 8 位模板缓冲区那样限制为 255 个对象。

于 2012-03-28T06:39:11.040 回答