安卓OpenGL ES 1.1:从模板缓冲区读取

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吗?或者有人能想出更好的算法来确定我的对象是否已被单击?
非常感谢。
1个回答

1

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

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

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


值得注意的是,上述方法需要一些技巧,因为纹理或渲染缓冲区附件中没有对8位颜色值的默认支持(glReadPixel值应相应缩放)。其他可能存在的问题包括:启用抖动和(但这只是一个猜想)可能来自硬件供应商的某些实现怪癖(例如,在光栅化期间,某些视频硬件可能不太精确)。虽然有点晚了,但其他人可能会像我一样查找这个答案。 - Rick77

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接