3

XCode が iOS 用の OpenGL プロジェクト用に作成するボイラー プレート OpenGL サンプル コードを実行しています。これにより、単純な ViewController がセットアップされ、GLKit を使用して残りの作業が処理されます。

アプリケーションのすべての更新/描画機能は C++ です。クロスプラットフォームです。

多くのフレームバッファの作成が進行中です。描画フェーズは、いくつかのフレーム バッファーにレンダリングしてから、既定のフレーム バッファーに戻そうとします。

glBindFramebuffer(GL_FRAMEBUFFER, 0);

これにより、GL_INVALID_ENUM が生成されます。iOS のみ。

私はその理由について完全に困惑しています。このコードは、iOS を除くすべての主要なプラットフォームで問題なく動作します。GLKit のせいにしたいです。GLKit を使用しない iOS OpenGL セットアップの例はありますか?

アップデート

次のコード スニペットでは、GLKit が使用しているデフォルトのフレームバッファを確認できます。なぜか「2」が出てきます。すべての glBindFrameBuffer 呼び出しで「2」を使用すると、うまくいきます。これは非常にイライラします。

[view bindDrawable ];

GLint defaultFBO;
glGetIntegerv(GL_FRAMEBUFFER_BINDING_OES, &defaultFBO);
LOGI("DEFAULT FBO: %d", defaultFBO);  

GLKit が内部フレームバッファを 0 で生成しない理由は何でしょうか? これは、OpenGL の他のすべての実装で使用されるセマンティックです。0 がデフォルトの FBO です。

4

3 に答える 3

4

iOS にはデフォルトのフレームバッファはありません。フレームバッファ オブジェクトは iOS での唯一のレンダリング ターゲット を参照してください。私はGLKitについてあまり知りませんが、iOSで画面に何かをレンダリングするには、フレームバッファを作成し、それにレンダバッファをアタッチし、このレンダバッファが描画する「画面」または「デフォルトのフレームバッファ」になることをCore Animation Layerに通知する必要がありますに。意味 - このフレームバッファに描画するものはすべて画面に表示されます。コア アニメーション レイヤへのレンダリング を参照してください。

于 2012-05-26T02:08:32.807 に答える
1

glBindFramebuffer(GL_FRAMEBUFFER, 0); への呼び出しをここで指摘する必要があると思います。Windows、Unix(Mac)、または Linux を実行しているマシンでは動作するように見えますが、レンダリングをメイン フレーム バッファに返しません。デスクトップとラップトップには、メインのデフォルト システム バッファの概念がありません。このアイデアは、ハンドヘルド デバイスから始まりました。パラメーターとしてゼロを指定して openGL bind 呼び出しを行うと、この関数を NULL に設定することになります。この機能を無効にする方法です。glBindTexture(GL_TEXTURE_2D, 0); も同様です。一部のハンドヘルド デバイスでは、別のフレーム バッファをアクティブにせずにフレーム バッファを NULL に設定すると、ドライバが自動的にメイン システムのフレーム バッファをアクティブにする可能性があります。これはメーカーの選択であり、信頼できるものではありません。これは、openGL ES 仕様の一部ではありません。デスクトップとラップトップの場合、通常の openGL レンダリングに戻すにはフレームバッファを無効にする必要があるため、これは絶対に必要です。

iOS デバイスでは、glBindFramebuffer(GL_FRAMEBUFFER, viewFramebuffer); という呼び出しを行う必要があります。ただし、システム フレームバッファに「viewFramebuffer」という名前を付けた場合に限ります。次の呼び出しの初期化コードを探します。 glGenFramebuffers(1, &viewFramebuffer); 最後に書いたものは何でも、メイン システム バッファに戻るときにバインドするものがあります。

GLKit を使用している場合は、次の呼び出し [((GLKView *) self.view) bindDrawable]; を使用できます。「self.view」は、特定の起動コードによって若干異なる場合があります。
また、iOS の場合、glBindFramebuffer(GL_FRAMEBUFFER, 2); を使用できます。ただし、これは Apple が今後リリースするデバイス間で一貫していない可能性があります。'2' のデフォルト値が '3' などに変更される可能性があるため、整数値の代わりに実際の名前を使用する必要があります。

于 2013-05-20T05:02:39.693 に答える
0
  • (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {

//セカンダリ/オフスクリーン フレーム バッファを使用してレンダリング結果を保存します

    [self.shader drawOffscreenOnFBO];

// GLKView のデフォルト フレーム バッファに戻る

    [((GLKView *) self.view) bindDrawable];

//メイン画面に描画 [self.shader drawinmainscreen];

}

参照..... http://districtf13.blogspot.com/

于 2015-08-07T06:03:53.073 に答える