Unityシェーダー:サーフェスシェーダー



Unity Shader Surface Shader



デザインの目的 :頂点ジオメトリチップシェーダー処理方法は、GPUが理解するのに適していますが、人間が理解するにはわかりにくいです。したがって、ユニティは、人間の理解に適した処理方法、つまり、サーフェスシェーダー-照明モデル-照明シェーダーを提供します。これは、頂点ジオメトリチップシェーダー上の抽象的なカプセル化のレイヤーであり、最終的には単一性によって頂点ジオメトリチップシェーダーの処理方法に変換されます。
サーフェスシェーダー:通常、レンダリング関連の変数を定義するために使用されます。
照明モデル:LambertやPhongなどの照明モデルを選択します。
ライトシェーダー:光の減衰と影を処理するために使用されます。

2つの構造 :これは、データをサーフェスシェーダー-ライティングモデル-ライティングシェーダーに転送するために使用される構造です。具体的な使用法は次のとおりです。
1. INPUT構造:主に、サーフェス関数に必要ないくつかの入力パラメーターを記録するために使用されます。これは、カスタマイズおよび拡張できます。一般的なパラメータは次のとおりです。
画像
2.SurfaceOutput / SurfaceOutputStandard / SurfaceOutputStandardSpecular構造:サーフェス関数の入力パラメーターを保存し、それらを照明処理の照明関数への出力パラメーターとして提供するために使用されます。関連する構造は固定されており、拡張することはできません。また、LambertやPhongなどの通常の照明モデルを選択する場合は、通常の照明機能に対応するようにSurfaceOutput構造を使用する必要があります。物理ベースの標準照明モデルを選択するときは、SurfaceOutputStandard構造を使用して、金属プロセスの照明機能に対応する必要があります。物理ベースのStandardSpecularライティングモデルを使用する場合、ハイライトライティング関数に対応するSurfaceOutputStandardSpecular構造を使用する必要があります。



コンパイル手順 :それは私たちが団結と相互作用するための方法です。対応する形式は次のとおりです。
#pragmasurfaceサーフェス関数lightMode [オプションのパラメーター]
1.表面機能:フォーマットは void surf(INPUT IN、inout SurfaceOutput / SurfaceOutputStandard / SurfaceOutputStandardSpecular o) 、ここでINPUTは、SurfaceOutput / SurfaceOutputStandard / SurfaceOutputStandardSpecularによって照明処理の照明関数に出力されるさまざまなサーフェスプロパティを設定するために使用されます。その中で、SurfaceOutput / SurfaceOutputStandard / SurfaceOutputStandardSpecularは、選択した照明モデルに従ってどちらを使用するかを決定します。
2.照明機能:フォーマットは hlaf4ライティングライティング関数名(SurfaceOutput / SurfaceOutputStandard / SurfaceOutputStandardSpecular s、half3 lightDir、half3 viewDir(オプション)、half atten) 。サーフェスシェーダー関数から出力されたサーフェス属性を使用して、指定されたライティングモデルを適用し、オブジェクトのサーフェスへのライティング効果をシミュレートします。
3.オプションのパラメーター:サーフェスシェーダーの動作を拡張するための一般的なオプションのパラメーターは次のとおりです。
カスタム変更機能 :頂点修正機能を設定して、一部の頂点を修正することができます。色変更機能を設定して、特定の色を変更することもできます。
制御コード生成 :execude_pathを使用して、サーフェスシェーダーが特定のレンダリングパスでのみ自動的に生成できるコードを制御します。
透明性のテストとブレンディング :透明度のブレンドにはalphaを使用し、透明度のテストにはalphatestを使用します。

統一されたサーフェスシェーダーの実装の背後にある原則 :サーフェスライトモデルライトシェーダーの処理方法は、頂点ジオメトリフラグメントシェーダーの上層での抽象的なカプセル化であるため、ユニティは最終的にそれを複数のパスに解決し、各パスの実行プロセスはおおよそ次のようになります。 :
1.頂点シェーダー処理関数を生成し、頂点データを処理関数に渡します。処理関数内で、最初に頂点変更関数を使用して頂点データを処理し、次にv2f_surf構造体の出力を入力します。
2.フラグメントシェーダーを生成してv2f_surf構造体データを受け取り、それをInput構造体に入力します。次に、構造体をサーフェス関数に渡して処理し、SurfaceOutput / SurfaceOutputStandard / SurfaceOutputStandardSpecular構造体を取得し、それを照明関数に渡して使用します。照明計算用に指定された照明モデルを使用し、取得したフラグメントの色を最後のフラグメント修正関数に入力して最終処理を行い、最終的なピクセルの色を取得します。
3.対応する処理フローチャートはおおまかに次のとおりです。
画像
4.生成されたvertex-geometry-fragmentシェーダーコードを表示します。これは、次の操作で表示できます。
画像



サーフェスシェーダーの長所と短所
1.利点:サーフェスシェーダーは頂点ジオメトリチップシェーダーの上位層にある抽象パッケージであるため、複雑なコードを記述したり、関連するパラメーターやコンパイル手順を直接定義したりする必要はありません。必要な効果を得ることができます。
2.短所:サーフェスシェーダーはそのルールに従ってコードを記述しなければならず、自由度が高くなく、内部で生成された頂点ジオメトリチップシェーダーが最適ではなく、パフォーマンスの問題を引き起こすことがよくあります。