iOSでOpenGLESを使用してコンテンツをレンダリングする唯一の方法は、オフスクリーンまたはオンスクリーンで、EAGLContextを介して行うことです。OpenGL ESプログラミングガイドから:
アプリケーションがOpenGLES関数を呼び出す前に、EAGLContextオブジェクトを初期化し、それを現在のコンテキストとして設定する必要があります。
次の行が混乱を引き起こしている可能性があると思います。
EAGLContextクラスは、アプリケーションがOpenGLESコンテンツをCoreAnimationと統合するために使用するメソッドも提供します。これらのメソッドがないと、アプリケーションはオフスクリーン画像の操作に制限されます。
つまり、コンテンツを画面にレンダリングする場合は、EAGLContextクラスによってのみ提供されるいくつかの追加メソッド(など)を使用し-renderbufferStorage:fromDrawable:
ます。画面外に描画する場合でも、OpenGL ESコマンドを管理するにはEAGLContextが必要ですが、画面上に描画するには、EAGLContextに固有のこれらの特定のメソッドが必要です。
2番目の質問に対して、オフスクリーンレンダリングをどのように設定するかは、このオフスクリーンレンダリングの構成(テクスチャバックFBO、デプスバッファーなど)によって異なります。たとえば、次のコードは、深度バッファを持たず、すでに設定されているoutputTexture
テクスチャにレンダリングする単純なFBOを設定します。
glActiveTexture(GL_TEXTURE1);
glGenFramebuffers(1, &filterFramebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, filterFramebuffer);
glBindTexture(GL_TEXTURE_2D, outputTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)currentFBOSize.width, (int)currentFBOSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, outputTexture, 0);
コード例として、オープンソースのGPUImageフレームワーク(単純な画像レンダリングを行うだけ)またはオープンソースのMoleculesアプリケーション(深度バッファーを使用してより複雑なオフスクリーンレンダリングを行う)内でこれを行う方法を確認できます。