Up to date

This page is up to date for Godot 4.3. If you still find outdated information, please open an issue.

CanvasItem(2D)シェーダー

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

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

レンダリングモード

レンダリングモード

説明

blend_mix

ミックスブレンドモード(アルファは透明度)、デフォルト。

blend_add

加算ブレンドモード。

blend_sub

減算ブレンドモード。

blend_mul

乗法ブレンドモード。

blend_premul_alpha

事前乗算されたアルファブレンドモード。

blend_disabled

ブレンドを無効にすると、値(アルファを含む)がそのまま書き込まれます。

unshaded

ALBEDO をそのまま出力します。マテリアルではライティング/シェーディングを行いません。

light_only

ライトパスでのみ描画します。

skip_vertex_transform

VERTEX は頂点関数で手動で変換する必要があります。

world_vertex_coords

VERTEX はローカル座標ではなくワールド座標で変更されます。

ビルトイン

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

グローバルビルトイン

グローバルビルトインは、カスタム関数を含め、どこでも使用できます。

ビルトイン

説明

in float TIME

Global time since the engine has started, in seconds. It repeats after every 3,600 seconds (which can be changed with the rollover setting). It's not affected by time_scale or pausing. If you need a TIME variable that can be scaled or paused, add your own global shader uniform and update it each frame.

in float PI

定数 PI は円周率 (3.141592)。円の円周と直径の比率と、半回転のラジアン量です。

in float TAU

定数 TAU` は円周率の2倍 (6.283185)。 PI * 2 と、1回転のラジアン量に相当します。

in float E

An E constant (2.718281). Euler's number and a base of the natural logarithm.

頂点プロセッサーのビルトイン

頂点データ (VERTEX) はローカル空間 (Node2D の原点を基準としたピクセル座標) に表示されます。書き込まれない場合、これらの値は変更されずそのまま渡されます。

ユーザーはモデルのワールド変換を無効にし (ワールドからスクリーンへの変換と投影は後で行われます)、次のコードを使用して手動で行うことができます:

shader_type canvas_item;
render_mode skip_vertex_transform;

void vertex() {

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

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

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

  • x: ラジアン単位の回転角度。

  • y: ライフタイム中のフェーズ(0〜1)。

  • z: アニメーションフレーム。

ビルトイン

説明

in mat4 MODEL_MATRIX

ローカル空間からワールド空間への変換。ワールド空間はエディタで通常使用される座標です。

in mat4 CANVAS_MATRIX

ワールド空間からキャンバス空間への変換。キャンバス空間では原点は画面の左上隅であり、座標の範囲は原点(0, 0)からビューポートのサイズまでです。

in mat4 SCREEN_MATRIX

キャンバス空間からクリップ空間への変換。クリップ空間内の座標は (-1, -1) から (1, 1) までの範囲です。

in int INSTANCE_ID

インスタンス化のためのインスタンスID。

in vec4 INSTANCE_CUSTOM

インスタンスのカスタムデータ。

in bool AT_LIGHT_PASS

常に false.

in vec2 TEXTURE_PIXEL_SIZE

デフォルトの2Dテクスチャの正規化されたピクセルサイズ。サイズが64x32pxのテクスチャを持つSprite2Dの場合、TEXTURE_PIXEL_SIZE = vec2(1/64, 1/32)

inout vec2 VERTEX

ローカル空間の頂点。

in int VERTEX_ID

頂点バッファー内の現在の頂点インデックス。

inout vec2 UV

正規化されたテクスチャ座標。範囲は 0 から 1 です。

inout vec4 COLOR

頂点プリミティブの色。

inout float POINT_SIZE

ポイント描画のポイントサイズ。

in vec4 CUSTOM0

Custom value from vertex primitive.

in vec4 CUSTOM1

Custom value from vertex primitive.

フラグメントプロセッサーのビルトイン

COLOR and TEXTURE

The built-in variable COLOR is used for a few things:

  • In the vertex() function, COLOR contains the color from the vertex primitive multiplied by the CanvasItem's modulate multiplied by the CanvasItem's self_modulate.

  • In the fragment() function, the input value COLOR is that same value multiplied by the color from the default TEXTURE (if present).

  • In the fragment() function, COLOR is also the final output.

Certain nodes (for example, Sprite2D) display a texture by default, for example texture. When using a custom fragment() function, you have a few options on how to sample this texture.

To read only the contents of the default texture, ignoring the vertex COLOR:

void fragment() {
  COLOR = texture(TEXTURE, UV);
}

To read the contents of the default texture multiplied by vertex COLOR:

void fragment() {
  // Equivalent to an empty fragment() function, since COLOR is also the output variable.
  COLOR = COLOR;
}

To read only the vertex COLOR in fragment(), ignoring the main texture, you must pass COLOR as a varying, then read it in fragment():

varying vec4 vertex_color;
void vertex() {
  vertex_color = COLOR;
}
void fragment() {
  COLOR = vertex_color;
}

NORMAL

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

NORMALMAP = texture(NORMAL_TEXTURE, UV).rgb;

ビルトイン

説明

in vec4 FRAGCOORD

スクリーン空間内のピクセルの中心の座標。 xy はウィンドウ内の位置を指定します。原点は左上です。

in vec2 SCREEN_PIXEL_SIZE

個々のピクセルのサイズ。解像度の逆数に等しい。

in vec2 POINT_COORD

描画ポイントの座標。

sampler2D TEXTURE

デフォルトの2Dテクスチャ。

in vec2 TEXTURE_PIXEL_SIZE

Normalized pixel size of default 2D texture. For a Sprite2D with a texture of size 64x32px, TEXTURE_PIXEL_SIZE = vec2(1/64, 1/32)

in bool AT_LIGHT_PASS

常に false.

sampler2D SPECULAR_SHININESS_TEXTURE

このオブジェクトの鏡面光沢テクスチャ。

in vec4 SPECULAR_SHININESS

テクスチャからサンプリングされた鏡面光沢色。

in vec2 UV

頂点関数からのUV。

in vec2 SCREEN_UV

現在のピクセルのスクリーンUV座標。

sampler2D SCREEN_TEXTURE

Godot 4では削除されました。代わりに sampler2Dhint_screen_texture を使用してください。

inout vec3 NORMAL

**NORMAL_TEXTURE ** からの法線の読み込み。書き込み可能。

sampler2D NORMAL_TEXTURE

デフォルトの2D法線テクスチャ。

out vec3 NORMAL_MAP

3D用の法線マップを2Dで使用できるように構成します。使用すると、NORMAL がオーバーライドされます。

out float NORMAL_MAP_DEPTH

スケーリングのための法線マップの深さ。

inout vec2 VERTEX

スクリーン空間内のピクセル位置。

inout vec2 SHADOW_VERTEX

VERTEX と同じですが、影を変更するために書き込むことができます。

inout vec3 LIGHT_VERTEX

VERTEX と同じですが、照明を変更するために書き込むことができます。 Z成分は高さを表します。

inout vec4 COLOR

COLOR from the vertex() function multiplied by the TEXTURE color. Also output color value.

ライトプロセッサーのビルトイン

ライトプロセッサー関数は、Godot 4.x と Godot 3.x では動作が異なります。 Godot 4.x では、すべてのライティングは通常の描画パス中に行われます。言い換えれば Godot はライトごとにオブジェクトを再描画しなくなりました。

ライトプロセッサー関数を実行したくない場合は render_mode unshaded; を使用してください。オブジェクトに対する照明の影響だけを確認したい場合は render_mode light_only; を使用します。これはオブジェクトが光で覆われている場所のみを表示したい場合に便利です。

ライト関数を定義すると、ライト関数が空であっても組み込みのライト関数が置き換えられます。

以下はCanvasItemの法線マップを考慮したライト シェーダーの例です。

void light() {
  float cNdotL = max(0.0, dot(NORMAL, LIGHT_DIRECTION));
  LIGHT = vec4(LIGHT_COLOR.rgb * COLOR.rgb * LIGHT_ENERGY * cNdotL, LIGHT_COLOR.a);
}

ビルトイン

説明

in vec4 FRAGCOORD

スクリーン空間内のピクセルの中心の座標。 xy はウィンドウ内の位置を指定します。原点は左下です。

in vec3 NORMAL

入力された法線。

in vec4 COLOR

入力された色。これはフラグメント関数の出力です。

in vec2 UV

頂点関数からのUV。フラグメント関数のUVと同等です。

sampler2D TEXTURE

CanvasItemに使用されている現在のテクスチャ。

in vec2 TEXTURE_PIXEL_SIZE

TEXTURE の正規化されたピクセルサイズ。64x32px の TEXTURE を持つ Sprite2D の場合 TEXTURE_PIXEL_SIZE = vec2(1/64, 1/32)

in vec2 SCREEN_UV

現在のピクセルのスクリーンUV座標。

in vec2 POINT_COORD

ポイントスプライトのUV。

in vec4 LIGHT_COLOR

ライトの色とライトのテクスチャを掛け合わせたもの。

in float LIGHT_ENERGY

ライトのエネルギー倍率。

in vec3 LIGHT_POSITION

スクリーン空間内のライトの位置。 DirectionalLight2D を使用する場合は常に vec3(0,0,0) になります。

in vec3 LIGHT_DIRECTION

スクリーン空間におけるライトの方向。

in bool LIGHT_IS_DIRECTIONAL

DirectionalLight2D のパスの場合は true

in vec3 LIGHT_VERTEX

フラグメント関数で変更されたスクリーン空間内のピクセル位置。

inout vec4 LIGHT

このライトの出力色。

in vec4 SPECULAR_SHININESS

オブジェクトのテクスチャで設定される鏡面光沢率。

out vec4 SHADOW_MODULATE

投影される影に掛ける色。

SDF関数

自動生成された、Signed Distance Field テクスチャをサンプリングするために実装された追加関数がいくつかあります。これらの関数はCanvasItemシェーダのフラグメント関数とライト関数で使用できます。

Signed Distance Field は、SDF Collision プロパティが有効(デフォルト設定) になっているシーン内に存在する LightOccluder2D ノードから生成されます。詳細については、2Dライトとシャドウ ドキュメントを参照してください。

関数

説明

float texture_sdf (vec2 sdf_pos)

SDFテクスチャのルックアップを実行します。

vec2 texture_sdf_normal (vec2 sdf_pos)

SDFテクスチャから法線を計算します。

vec2 sdf_to_screen_uv (vec2 sdf_pos)

Converts an SDF to screen UV.

vec2 screen_uv_to_sdf (vec2 uv)

Converts screen UV to an SDF.