複数のオブジェクトをレンダリングするには、いくつのOpenGLプログラムを使用する必要がありますか?


10

私のシーンには複数のオブジェクトが含まれています。(3つの立方体、1つの円柱、8つの球体としましょう。)それぞれに頂点シェーダーを作成する必要があると仮定します。いくつのプログラムが必要ですか?

代替案:

  • オブジェクトごとに1つのプログラム
  • すべてのキューブ用のプログラムと、すべての球用のプログラム(同じシェーダーを使用する場合)
  • すべてのための1つの大きなプログラム

正しいアプローチは何ですか?


1
「それぞれに頂点シェーダーを作成する必要があると思います。」なぜこれを想定しているのですか?頂点シェーダーは、モデルとビューマトリックスに従って頂点を変換します。ほとんどすべての場合、同じにする必要があります。
usm

回答:


8

シェーダープログラムは、テクスチャと同様の状態の一部と見なす必要があります。状態の変更にはコストがかかるため、テクスチャの変更を回避するために、複数のテクスチャを1つにまとめることができる場合があります。同じことがシェーダーにも当てはまります。複数のシェーダーを組み合わせて状態の変更を回避できる場合があります。

テクスチャの組み合わせと同様に、シェーダーの組み合わせにはオーバーヘッドが伴います。4096x4096のテクスチャから16x16ピクセルの領域のみをレンダリングすると、ハードウェアを効率的に使用できなくなります。同様に、レンダリングするオブジェクトがシェーダーのコードの10%のみを使用する場合、グラフィックカードが大量のデータを不必要に計算している可能性があります(その可能性さえあります)。

要するに、「依存する」。


4
さらに、多くの場合、1つのシェーダーだけで十分です。違いは、色、テクスチャ、法線マップなど、シェーダーに渡すユニフォームのみです
rioki

うん、たとえば、うろこ状に見えるフラグメントを生成し、それを使用して3つの立方体、1つの円柱、8つの球体すべてをレンダリングできるような方法で機能する「うろこ状」シェーダーがあるかもしれません。 1つのシェーダー(もちろん、対応するジオメトリプリミティブを使用)。ここでのユニフォームの合理的なセットは、色を定義するベクトル値であり、いくつかのスカラーまたは視覚効果の「うろこ状」または「光沢」に影響を与える何かかもしれません。次に、1つのシェーダーがあり、個々のジオメトリの描画間のユニフォームを変更することで、シェーダーがフラグメントに色を付ける方法を変更します。
Steven Lu

5

物事をできる限りシンプルにすることが最善です。すべてのオブジェクトに同じシェーダーを複製する必要はなく、すぐに肥大化します。また、不要なオーバーヘッドが発生する可能性があるため、考えられるすべてのユースケースをカバーする1つの巨大なシェーダーは必要ありません。

シェーダー管理についてはいくつかの意見があり、これに「最適な」方法はありません。すべてのシェーダーがオンザフライでオフパラメーターに基づいて生成されるシェーダーの実装を見たことさえあります(たとえば、Unrealエンジンで)。

この分野を始めたばかりの人にとっては、最初に基本的なシェーダーを鉛筆で描くのが良いでしょう。たとえば、テクスチャのないオブジェクト用のシェーダー、基本的なテクスチャーおよびピクセルごとのライティングサポートを備えたシェーダーなどがあります。次に、前のシェーダーでは実行できないさまざまな効果が必要になるたびに、新しいエフェクト用に新しいものを作成します。

このようなシステムの目的は、物事をシンプルに保つことです。ただ。保つ。それ。シンプル。


+1あなたが現在の業界が何をしているかに言及したので。
Krythic
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.