【问题标题】:Android OpenGL ES 1.1: Read from Stencil BufferAndroid OpenGL ES 1.1:从模板缓冲区读取
【发布时间】:2012-02-22 04:56:30
【问题描述】:

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

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

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

所以我想出了一个主意……

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

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

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

非常感谢

【问题讨论】:

    标签: android framebuffer stencil-buffer opengl-es-1.1


    【解决方案1】:

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

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

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

    【讨论】:

    • 可能值得注意的是,上述方法需要一些技巧,因为在渲染缓冲区附件的纹理中没有默认支持 8 位颜色值(glReadPixel 值应该相应地缩放)。其他陷阱可能包括:glEnabled 抖动和(但这是一个疯狂的hyotesys)可能来自硬件供应商的一些实现怪癖(例如,某些视频硬件在光栅化期间可能不那么精确)。有点晚了,但其他人可能会像我一样查找此答案。
    猜你喜欢
    • 2011-03-09
    • 2020-04-10
    • 2014-12-18
    • 2011-02-05
    • 2016-05-04
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多