質問

アホイ!

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

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

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

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

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

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

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

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

役に立ちましたか?

解決

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

この新しいフレームワークのベストプラクティスに関する詳細情報を入手するには、GLKBaseEffectを広範囲に使用した人々によって作成されたチュートリアルがさらに必要であることに同意します。

ハッピーセーリング..

他のヒント

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top