0

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

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

4

2 回答 2

1

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

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

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

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

于 2013-09-25T23:06:31.637 回答
0

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

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

于 2013-09-27T06:38:56.183 回答