CanvasItemシェーダー

CanvasItemシェーダーは、Godotですべての2D要素を描画するために使用されます。これらには、CanvasItemsから継承するすべてのノード、およびすべてのGUI要素が含まれます。

CanvasItemシェーダーには、Spatialシェーダーよりも少ない組み込み変数と関数が含まれていますが、頂点、フラグメント、およびライトプロセッサー関数と同じ基本構造を維持しています。

レンダリングモード

レンダリングモード 説明
blend_mix ミックスブレンドモード(アルファは透明度)、デフォルト。
blend_add 加算ブレンドモード。
blend_sub 減算ブレンドモード。
blend_mul 乗法ブレンドモード。
blend_premul_alpha 事前乗算されたアルファブレンドモード。
blend_disabled ブレンドを無効にすると、値(アルファを含む)がそのまま書き込まれます。
unshaded 結果は単なるアルベドです。マテリアルではライティング/シェーディングは発生しません。
light_only ライトパスでのみ描画します。
skip_vertex_transform VERTEX/NORMAL/その他は、頂点関数で手動で変換する必要があります。

頂点用ビルトイン

"in"としてマークされた値は読み取り専用です。"out"とマークされた値はオプションの書き込み用であり、必ずしも適切な値を含むとは限りません。"inout"とマークされた値は、適切なデフォルト値を提供し、オプションで書き込むことができます。サンプラーは書込みの対象ではなく、マークされていません。

頂点データ(VERTEX)はローカル空間(カメラに対するピクセル座標)に表示されます。書き込まれていない場合、これらの値は変更されず、そのまま渡されます。

ユーザーは組み込みのmodelview変換を無効にし(投影は後で行われます)、次のコードを使用して手動で実行できます:

shader_type canvas_item;
render_mode skip_vertex_transform;

void vertex() {

    VERTEX = (EXTRA_MATRIX * (WORLD_MATRIX * vec4(VERTEX, 0.0, 1.0))).xy;
}

注釈

WORLD_MATRIX は実際にはモデルビューマトリックスです。ローカル空間で入力を受け取り、それをビュー空間に変換します。

頂点のワールド空間座標を取得するには、次のようなカスタムのuniformを渡す必要があります:

material.set_shader_param("global_transform", get_global_transform())

次に、頂点シェーダーで:

uniform mat4 global_transform;
varying vec2 world_position;

void vertex(){
    world_position = (global_transform * vec4(VERTEX, 0.0, 1.0)).xy;
}

world_position は頂点関数またはフラグメント関数で使用できます。

UVやCOLORなどの他のビルトインも、変更されていない場合はフラグメント関数に渡されます。

インスタンス化の場合、INSTANCE_CUSTOM変数にはインスタンスのカスタムデータが含まれます。パーティクルを使用する場合、この情報は通常次のとおりです:

  • x: ラジアン単位の回転角度。
  • y: ライフタイム中のフェーズ(0〜1)。
  • z: アニメーションフレーム。
ビルトイン 説明
in mat4 WORLD_MATRIX イメージ空間からビュー空間への変換。
in mat4 EXTRA_MATRIX 追加の変換。
in mat4 PROJECTION_MATRIX ビュー空間からクリップ空間への変換。
in float TIME 秒単位のグローバル時間。
in vec4 INSTANCE_CUSTOM インスタンスのカスタムデータ。
in bool AT_LIGHT_PASS ライトパスの場合はこれが true
inout vec2 VERTEX イメージ空間内の頂点。
in vec2 TEXTURE_PIXEL_SIZE デフォルトの2Dテクスチャの正規化されたピクセルサイズ。サイズが64x32pxのテクスチャを持つスプライトの場合、TEXTURE_PIXEL_SIZE = vec2(1/64, 1/32)
inout vec2 UV UV。
inout vec4 COLOR 頂点プリミティブの色。
inout float POINT_SIZE ポイント描画のポイントサイズ。

フラグメント用ビルトイン

特定のノード(たとえば、Sprites)は、デフォルトでテクスチャを表示します。ただし、カスタムフラグメント関数がこれらのノードにアタッチされている場合、テクスチャルックアップは手動で行う必要があります。 Godotは、組み込みの COLOR 変数にテクスチャの色を提供しません。そのようなノードのテクスチャカラーを読み取るには、次を使用します:

COLOR = texture(TEXTURE, UV);

これは、ビルトイン法線マップの動作とは異なります。法線マップがアタッチされている場合、Godotはデフォルトでそれを使用し、その値を組み込みの NORMAL 変数に割り当てます。3Dで使用するための法線マップを使用している場合は、反転して表示されます。シェーダーで使用するには、NORMALMAP プロパティに割り当てる必要があります。Godotは、2Dで使用するために変換し、NORAMAL を上書きします。

NORMALMAP = texture(NORMAL_TEXTURE, UV).rgb;
ビルトイン 説明
in vec4 FRAGCOORD ピクセルの中心の座標。画面スペース内。xy はウィンドウ内の位置を指定し、zDEPTH を使用しない場合のフラグメントの深さを指定します。原点は左下です。
inout vec3 NORMAL **NORMAL_TEXTURE ** からの法線の読み込み。書き込み可能。
out vec3 NORMALMAP 2Dで使用する3D用の法線マップを構成します。使用する場合、NORMAL を上書きします。
inout float ** NORMALMAP_DEPTH ** スケーリングのための法線マップの深さ。
in vec2 UV 頂点関数からのUV。
inout vec4 COLOR 頂点関数の色と出力フラグメントの色。使用しない場合、**TEXTURE ** 色に設定されます。
in sampler2D TEXTURE デフォルトの2Dテクスチャ。
in sampler2D NORMAL_TEXTURE デフォルトの2D法線テクスチャ。
in vec2 TEXTURE_PIXEL_SIZE デフォルトの2Dテクスチャの正規化されたピクセルサイズ。サイズが64x32pxのテクスチャを持つスプライトの場合、TEXTURE_PIXEL_SIZE = vec2(1/64, 1/32)
in vec2 SCREEN_UV **SCREEN_TEXTURE ** で使用するスクリーンUV。
in vec2 SCREEN_PIXEL_SIZE 個々のピクセルのサイズ。解像度の逆数に等しい。
in vec2 POINT_COORD 描画ポイントの座標。
in float TIME 秒単位のグローバル時間。
in bool AT_LIGHT_PASS ライトパスの場合はこれが true
in sampler2D SCREEN_TEXTURE 画面テクスチャ、ミップマップにはガウスぼかしバージョンが含まれています。

ライト用ビルトイン

ライトプロセッサの機能は、2Dでの動作と3Dでの動作が異なります。 CanvasItemシェーダーでは、シェーダーは描画されるオブジェクトに対して1回呼び出され、次にシーン内のそのオブジェクトに触れる各ライトに対して1回呼び出されます。そのオブジェクトに対してライトパスを発生させたくない場合は、render_mode unshaded を使用します。そのオブジェクトに対してのみライトパスを発生させたい場合は、render_mode light_only を使用します。これは、光で覆われた場所にのみオブジェクトを表示する場合に役立ちます。

シェーダーがライトパス上にある場合、AT_LIGHT_PASS 変数は true になります。

ビルトイン 説明
in vec4 FRAGCOORD ピクセルの中心の座標。画面スペース内。xy はウィンドウ内の位置を指定し、zDEPTH を使用しない場合のフラグメントの深さを指定します。原点は左下です。
in vec3 NORMAL 入力される法線。この値は渡されてきますが、法線の計算はこの関数の外部で行われます
in vec2 UV 頂点関数からのUV。フラグメント関数のUVと同等です。
in vec4 COLOR 入力される色。これは、最終的な変調が適用されたフラグメント関数の出力です。
sampler2D TEXTURE CanvasItemに使用されている現在のテクスチャ。
in vec2 TEXTURE_PIXEL_SIZE デフォルトの2Dテクスチャの正規化されたピクセルサイズ。サイズが64x32pxのテクスチャを持つスプライトの場合、TEXTURE_PIXEL_SIZE = vec2(1/64, 1/32)
in vec2 SCREEN_UV SCREEN_TEXTURE Coordinate (for using with screen texture).
in vec2 POINT_COORD ポイントスプライトのUV。
in float TIME 秒単位のグローバル時間。
inout vec2 LIGHT_VEC ローカル座標でのライトからフラグメントへのベクトル。法線マップを使用する場合、照明の方向を変更するように変更できます。
inout vec2 SHADOW_VEC ローカル座標でのライトからフラグメントへのベクトル。シャドウ計算を変更するために変更できます。
inout float LIGHT_HEIGHT ライトの高さ。法線が使用されている場合にのみ有効です。
inout vec4 LIGHT_COLOR ライトの色。
in vec2 LIGHT_UV ライトテクスチャのUV。
out vec4 SHADOW_COLOR ライトの影の色。
inout vec4 LIGHT ライトテクスチャと出力カラーの値。変更できます。使用しない場合、ライト関数は無視されます。