在ios上选择opengl-es的代码

时间:2013-09-24 09:50:16

标签: ios ipad opengl-es

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

设置自己的GL渲染缓冲区并不太困难,并且在整个地方都有示例代码。我已经在Apple开发站点和OpenGL SuperBible上使用了示例代码。

答案 1 :(得分:0)

实际上即使使用GLKView,也很有可能从后备缓冲区读取。该文件表明它不建议 - 但经过一些小小的摆弄我得到它的工作。唯一有问题的是glreadpixels只能将GL_RGBA作为参数(而不是GL_RGB)。只要您确保在拾取后调用glClear,就不会将对象ID渲染到屏幕上。

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