【问题标题】:picking code for opengl-es on ios在 ios 上为 opengl-es 挑选代码
【发布时间】:2013-09-27 14:38:56
【问题描述】:

目前我正在使用快照进行挑选。我更改渲染代码以渲染对象 ID,获取快照,然后获取用户点击下的像素值。我认为这非常低效 - 我收到一些 ipad 运行缓慢的报告(我的 mini 很好)。

是否可以渲染到后台缓冲区,并使用 glreadpixels 调用来仅检索用户点击下的像素而不将对象 ID 渲染到屏幕上?我正在使用 GLKView 进行渲染。我已经用我当前的代码尝试了 glreadpixels - 它似乎总是返回黑色。我知道 GLKView 的文档建议只使用快照,但肯定更有效地选择只检索单个像素。

【问题讨论】:

    标签: ios ipad opengl-es


    【解决方案1】:

    你是对的,更好的方法是将对象 ID 渲染到后台缓冲区并读回特定像素(或像素块)。

    (如果您要进行大量选择,您甚至可以使用第二个屏幕外渲染缓冲区并在单个渲染过程中每帧生成对象 ID。)

    但是您必须编写自己的视图代码来分配屏幕外渲染缓冲区、深度缓冲区等等。 GLKView 是一个便利类,一个高级包装器,Apple 文档明确表示不要弄乱底层实现。

    设置您自己的 GL 渲染缓冲区并不难,而且到处都有示例代码。我使用了 Apple 开发网站和 OpenGL SuperBible 上的示例代码。

    【讨论】:

    【解决方案2】:

    实际上,即使使用 GLKView,也可以从后台缓冲区中读取。该文档指出不建议这样做 - 但经过一番摆弄后,我让它工作了。唯一的问题是 glreadpixels 只能将 GL_RGBA 作为参数(而不是 GL_RGB)。只要确保在拾取后调用 glClear,您就不会将对象 ID 呈现到屏幕上。

    使用快照在 ipad mini 上进行挑选会使应用程序的速度降低 50%。使用 glReadPixels 根本不会导致明显的减速。您可以通过分配额外的帧缓冲区来做到这一点 - 但我认为没有必要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-02
      • 2023-03-30
      • 1970-01-01
      • 2011-07-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多