Drowsy Dog's Diary

any note, any thought

iOS6でglReadPixels( )が空っぽになる

| 0 comments

OpenGL ES view のフレームバッファのキャプチャについて。

こんな感じでしていました。

が、iOS6 ではこの glReadPixels() の返りが真っ暗になっていました。

Apple オフィシャルの Q&A を読むと、
http://developer.apple.com/library/ios/#qa/qa1704/_index.html

By default, the contents of a renderbuffer are invalidated after you present them to the display. Therefore, to get defined results when reading your OpenGL ES content, you must do one of the following:

1) Call glReadPixels before calling EAGLContext/-presentRenderbuffer:, or

2) Set the CAEAGLLayer’s retained backing property to true to retain the contents of the layer. However, this can have adverse performance implications so you are cautioned to use this setting only when necessary.

The above restrictions do not apply for offscreen, non-displayable framebuffers.

要は、表示してしまっている EAGLContext は、renderbuffer にあるピクセルデータがすでに正常なデータではないので、

1) 表示の前に読むか
2) retained back buffer を CAEAGLLayer に設定しろ

ということらしいです。
試しに、EAGLLayer を作るときに、

と、drawableProperties に kEAGLDrawablePropertyRetainedBacking を設定してやれば正常にキャプチャできました。

ただし、この方法は性能に影響が出るので、必要なときにだけ設定するようにしましょう。
また、表示していないフレームバッファについては、この設定は必要ないとのことです。


Author: kazoo

犬はさよならを言わないのだ。

コメントを残す

Required fields are marked *.