3

アホイ!

GLKit に追加された新機能をブラッシュ アップするために、いくつかの古いテスト コードを更新することを検討しています。これまでのところ、GLKViewController をセットアップし、いくつかの基本的な形状のレンダリングを開始することができましたが、GLKBaseEffect に関する適切な情報を見つけるのに苦労しました。

GLKBaseEffect のドキュメントには次のように記載されています。

初期化時に、アプリケーションは最初に OpenGL ES 2.0 コンテキストを作成し、それを現在の状態にします。次に、新しい効果オブジェクトを割り当てて初期化し、そのプロパティを構成して、その prepareToDraw メソッドを呼び出します。エフェクトをバインドすると、シェーダーがコンパイルされ、現在の OpenGL ES コンテキストにバインドされます。ベース エフェクトでは、アプリケーションから提供される頂点データも必要です。頂点データを提供するには、1 つまたは複数の頂点配列オブジェクトを作成します。シェーダーが必要とする属性ごとに、頂点配列オブジェクトは属性を有効にし、頂点バッファー オブジェクトに格納されたデータを指す必要があります。

私が見分けるのに苦労しているのは;

レンダリングする「モデル」ごとに GLKBaseEffect オブジェクトが必要ですか? それとも、「シーン」ごとに 1 つの GLKBaseEffect を使用し、prepareToDraw を呼び出す前にその場でプロパティを変更するだけですか?

モデルごとに 1 つの GLKBaseEffect を単純に使用するゲーム エンジンとレンダラーのチュートリアルをいくつか見てきましたが、代わりに 1 つのインスタンスで同じことが達成できるとしたら、これはまったく非効率的です。

ドキュメントを読むと、これが最良のアプローチのように思えますが、非常に多くの人が複数のインスタンスを使用しているのを見たことを考えると、そうではないと思い始めています。

誰でもこれに光を当てることができますか?GLKit は iOS にとって (そして私にとって) まだかなり新しいので、どんな情報でも大歓迎です。

4

2 に答える 2

5

いいえ、オブジェクトごとに一意の GLKBaseEffect を作成しないでください。たとえば、迷路を描いている場合、その迷路内の各レンガは独自のオブジェクトである可能性がありますが、それらはすべて同じ GLKBaseEffect を共有できます。ただし、GLKBaseEffect は、テクスチャ、ライティング、フォグなどと同様に、場所にも情報を保存することを忘れないでください。したがって、レンガを複数の場所に描画する場合 (そうすると思います :-)、それらの変換行列を微調整して呼び出します。 「prepareToDraw」API。

この新しいフレームワークのベスト プラクティスに関する情報を得るには、GLKBaseEffect を広く使用している人々によって書かれたチュートリアルがもっと必要であることに同意します。

幸せな航海..

于 2012-01-22T22:16:20.523 に答える
4

「基本」プロパティ (lightingType、lightModelTwoSided、colorMaterialEnabled など) を変更するたびに、次の「prepareToDraw」呼び出しで新しいシェーダー プログラムがロードされます。

したがって、レンダリング順序を使用しない場合は、レンダリングされるオブジェクトごとに 1 つの効果を使用するか、すべてのオブジェクトに単一の変更効果を使用するかはほとんど問題になりません。どちらの場合も、不必要な glUseProgram 呼び出しと、描画されたオブジェクトごとに多くの不必要な OpenGL 状態の変更が発生します。(インストゥルメントの「OpenGL ES 分析」テンプレートを使用して、生成された OpenGL 呼び出しを調査します)

とはいえ、主な関心事は、レンダリングするオブジェクトを注文することです。少なくとも、同じシェーダー プログラムを使用するすべてのオブジェクトをグループ化します。次に、それらのグループごとに 1 つの GLKBaseEffect オブジェクトを作成して使用します。GLKBaseEffect プロパティの変更によって新しいシェーダー プログラムが読み込まれるかどうかわからない場合は、Instruments を使用して OpenGL 呼び出しを調査することをお勧めします。

于 2012-02-14T00:00:50.863 に答える