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 |
in float PI |
定数 |
in float TAU |
定数 TAU` は円周率の2倍 ( |
in float E |
An |
頂点プロセッサーのビルトイン
頂点データ (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 |
常に |
in vec2 TEXTURE_PIXEL_SIZE |
デフォルトの2Dテクスチャの正規化されたピクセルサイズ。サイズが64x32pxのテクスチャを持つSprite2Dの場合、TEXTURE_PIXEL_SIZE = |
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,COLORcontains 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 valueCOLORis that same value multiplied by the color from the defaultTEXTURE(if present).In the
fragment()function,COLORis 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 |
スクリーン空間内のピクセルの中心の座標。 |
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,
|
in bool AT_LIGHT_PASS |
常に |
sampler2D SPECULAR_SHININESS_TEXTURE |
このオブジェクトの鏡面光沢テクスチャ。 |
in vec4 SPECULAR_SHININESS |
テクスチャからサンプリングされた鏡面光沢色。 |
in vec2 UV |
頂点関数からのUV。 |
in vec2 SCREEN_UV |
現在のピクセルのスクリーンUV座標。 |
sampler2D SCREEN_TEXTURE |
Godot 4では削除されました。代わりに |
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 |
|
inout vec3 LIGHT_VERTEX |
|
inout vec4 COLOR |
|
ライトプロセッサーのビルトイン
ライトプロセッサー関数は、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 |
スクリーン空間内のピクセルの中心の座標。 |
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 = |
in vec2 SCREEN_UV |
現在のピクセルのスクリーンUV座標。 |
in vec2 POINT_COORD |
ポイントスプライトのUV。 |
in vec4 LIGHT_COLOR |
ライトの色とライトのテクスチャを掛け合わせたもの。 |
in float LIGHT_ENERGY |
ライトのエネルギー倍率。 |
in vec3 LIGHT_POSITION |
スクリーン空間内のライトの位置。 |
in vec3 LIGHT_DIRECTION |
スクリーン空間におけるライトの方向。 |
in bool LIGHT_IS_DIRECTIONAL |
|
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. |