私のシーンには複数のオブジェクトが含まれています。(3つの立方体、1つの円柱、8つの球体としましょう。)それぞれに頂点シェーダーを作成する必要があると仮定します。いくつのプログラムが必要ですか?
代替案:
- オブジェクトごとに1つのプログラム
- すべてのキューブ用のプログラムと、すべての球用のプログラム(同じシェーダーを使用する場合)
- すべてのための1つの大きなプログラム
正しいアプローチは何ですか?
私のシーンには複数のオブジェクトが含まれています。(3つの立方体、1つの円柱、8つの球体としましょう。)それぞれに頂点シェーダーを作成する必要があると仮定します。いくつのプログラムが必要ですか?
代替案:
正しいアプローチは何ですか?
回答:
シェーダープログラムは、テクスチャと同様の状態の一部と見なす必要があります。状態の変更にはコストがかかるため、テクスチャの変更を回避するために、複数のテクスチャを1つにまとめることができる場合があります。同じことがシェーダーにも当てはまります。複数のシェーダーを組み合わせて状態の変更を回避できる場合があります。
テクスチャの組み合わせと同様に、シェーダーの組み合わせにはオーバーヘッドが伴います。4096x4096のテクスチャから16x16ピクセルの領域のみをレンダリングすると、ハードウェアを効率的に使用できなくなります。同様に、レンダリングするオブジェクトがシェーダーのコードの10%のみを使用する場合、グラフィックカードが大量のデータを不必要に計算している可能性があります(その可能性さえあります)。
要するに、「依存する」。
物事をできる限りシンプルにすることが最善です。すべてのオブジェクトに同じシェーダーを複製する必要はなく、すぐに肥大化します。また、不要なオーバーヘッドが発生する可能性があるため、考えられるすべてのユースケースをカバーする1つの巨大なシェーダーは必要ありません。
シェーダー管理についてはいくつかの意見があり、これに「最適な」方法はありません。すべてのシェーダーがオンザフライでオフパラメーターに基づいて生成されるシェーダーの実装を見たことさえあります(たとえば、Unrealエンジンで)。
この分野を始めたばかりの人にとっては、最初に基本的なシェーダーを鉛筆で描くのが良いでしょう。たとえば、テクスチャのないオブジェクト用のシェーダー、基本的なテクスチャーおよびピクセルごとのライティングサポートを備えたシェーダーなどがあります。次に、前のシェーダーでは実行できないさまざまな効果が必要になるたびに、新しいエフェクト用に新しいものを作成します。
このようなシステムの目的は、物事をシンプルに保つことです。ただ。保つ。それ。シンプル。