シェーダー

はじめに

シェーダーは、GPU上で実行される独自のプログラムです。メッシュデータ(頂点の位置、色、法線など)を取得して画面に描画する方法を指定するために使用されます。シェーダーは、GPUでの実行用に最適化されているため、通常のプログラムと同じように情報を処理しません。この結果、シェーダーは実行後にデータを保持しません。最終的な色を画面に出力し、次に進みます。したがって、シェーダーの最後の実行からのカラー出力にアクセスする方法はありません。

Godotは、GLSLと非常によく似たシェーダー言語を使用しますが、機能が追加され、柔軟性がわずかに低下します。これを行う理由は、Godotが組み込み関数を統合して、複雑なシェーダーの作成を大幅に簡単にするためです。 Godotは、ユーザーが作成したシェーダーコードを独自のコードでラップします。このようにして、Godotはユーザーが心配する必要のない低レベルのものを多数処理し、シェーダーコードを解析し、それを使用してレンダリングパイプラインに影響を与えることができます。より高度なシェーダーの場合、render_modeを使用してこの機能をオフにできます。

このドキュメントは、Godot固有のシェーダーに関する情報を提供します。 Godotのシェーディング言語の詳細なリファレンスについては、Godot shading language doc を参照してください。

シェーダーの種類

すべての用途(2D、3D、パーティクル)に汎用的な設定を提供する代わりに、Godotシェーダーは目的を指定する必要があります。さまざまなタイプがさまざまなレンダリングモード、組み込み変数、および処理関数をサポートしています。

すべてのシェーダーは、最初の行で次の形式でタイプを指定する必要があります:

shader_type spatial;

有効なタイプは以下のとおりです:

各シェーディングタイプの詳細については、対応するリファレンスドキュメントを参照してください。

レンダリングモード

さまざまなシェーダータイプがさまざまなレンダリングモードをサポートします。これらは、オプションであり、指定する場合は、shader_typeの後に指定する必要があります。レンダリングモードは、組み込み機能の処理方法を変更するために使用されます。たとえば、レンダリングモード unshaded を使用して、組み込みのライトプロセッサ機能をスキップするのが一般的です。

レンダリングモードは、シェーダータイプの下に指定されます:

shader_type spatial;
render_mode unshaded, cull_disabled;

各シェーダータイプには、使用可能なレンダリングモードの異なるリストがあります。レンダリングモードの完全なリストについては、各シェーダータイプのドキュメントを参照してください。

プロセッサー関数

シェーダーのタイプに応じて、異なるプロセッサー関数がオプションでオーバーライドされる場合があります。"spatial" および "canvas_item" の場合、vertexfragment および light をオーバーライドできます。"particles" の場合、オーバーライドできるのは``vertex`` のみです。

頂点プロセッサー

vertex 処理関数は、"spatial" および "canvas_item" シェーダーのすべての頂点に対して1回呼び出されます。"particles" シェーダーの場合、すべてのパーティクルに対して1回呼び出されます。

vertex 関数は、フラグメント関数に渡される頂点ごとの情報を変更するために使用されます。また、変数を使用してフラグメント関数に送信される変数を確立するためにも使用できます(他のドキュメントを参照)。

デフォルトでは、Godotは頂点情報を取得し、それに応じて変換して描画します。これが望ましくない場合は、レンダリングモードを使用して自分でデータを変換できます。この例については、Spatial shader doc を参照してください。

フラグメントプロセッサー

fragment 処理関数は、ピクセルごとにGodotマテリアルパラメーターを設定するために使用されます。このコードは、オブジェクトまたはプリミティブが描画するすべての可視ピクセルで実行されます。"spatial" および "canvas_item" シェーダーでのみ使用できます。

フラグメント関数の標準的な使用法は、ライティングの計算に使用されるマテリアルプロパティを設定することです。たとえば、ROUGHNESSRIMまたは TRANSMISSION の値を設定して、ライトがそのフラグメントにどのように応答するかをライト機能に伝えます。これにより、ユーザーが多くのコードを記述することなく、複雑なシェーディングパイプラインを制御できます。この組み込み機能が必要ない場合は、それを無視して独自のライト処理関数を記述すれば、Godotはそれを最適化します。たとえば、RIM に値を書き込まない場合、Godotはリム照明を計算しません。コンパイル中、Godotは RIM が使用されているかどうかを確認します。そうでない場合は、対応するすべてのコードを切り取ります。したがって、使用しない効果の計算を無駄にすることはありません。

ライトプロセッサー

light プロセッサーもピクセルごとに実行されますが、オブジェクトに影響を与えるすべてのライトに対しても実行されます(ライトがオブジェクトに影響を与えない場合は実行されません)。これは fragment プロセッサー内で呼び出される関数として存在し、通常は fragment 関数内で設定されたマテリアルプロパティで動作します。

light プロセッサは、2Dでは3Dとは異なる動作をします。それぞれの仕組みの説明については、CanvasItem shadersSpatial shaders のそれぞれのドキュメントを参照してください 。