Up to date
This page is up to date for Godot 4.3.
If you still find outdated information, please open an issue.
Spatial(3D)シェーダー
Spatialシェーダーは、3Dオブジェクトのシェーディングに使用されます。 Godotが提供するシェーダーの中で最も複雑なタイプです。Spatialシェーダーは、さまざまなレンダリングモードとさまざまなレンダリングオプション(たとえば、サブサーフェース散乱、透過、アンビエントオクルージョン、リム照明など)で高度に構成できます。オプションで、頂点、フラグメント、ライトプロセッサ関数を記述して、オブジェクトの描画方法に影響を与えることができます。
レンダリングモード
レンダリングモード |
説明 |
|---|---|
blend_mix |
ミックスブレンドモード(アルファは透明度)、デフォルト。 |
blend_add |
加算ブレンドモード。 |
blend_sub |
減算ブレンドモード。 |
blend_mul |
乗法ブレンドモード。 |
depth_draw_opaque |
不透明なジオメトリに対してのみ深度を描画します(透明ではありません)。 |
depth_draw_always |
常に深度を描画します(不透明および透明)。 |
depth_draw_never |
深度の描画をしません。 |
depth_prepass_alpha |
半透明ジオメトリでも深さの事前パス(デプスプリパス)を行います。 |
depth_test_disabled |
深度テストを無効にします。 |
sss_mode_skin |
スキンの表面下散乱(サブサーフェス・スキャタリング)モード。 |
cull_back |
背面(法線が視点と逆方向に向いている)を間引きます(デフォルト)。 |
cull_front |
前面(法線が視点の方向に向いている)を間引きます。 |
cull_disabled |
カリングは無効です(両面を描画)。 |
unshaded |
ALBEDO をそのまま出力します。マテリアルではライティング/シェーディングを行いません。 |
wireframe |
ジオメトリはライン描画(ワイヤーフレーム描画)されます。 |
diffuse_burley |
拡散反射を物理ベース Burley (Disney PBS) で計算します (デフォルト)。 |
diffuse_lambert |
拡散反射をランバートシェーディングで計算します。 |
diffuse_lambert_wrap |
拡散反射をランバートラッピング (回り込みはラフネスに依存)で計算します。 |
diffuse_toon |
拡散反射をトゥーンシェーディングで計算します。 |
specular_schlick_ggx |
鏡面反射をSchlick-GGXで計算します (デフォルト)。 |
specular_toon |
鏡面反射をトゥーンで計算します。 |
specular_disabled |
鏡面反射を無効にします。 |
skip_vertex_transform |
VERTEX/NORMAL/その他を、頂点関数で手動で変換する必要があります。 |
world_vertex_coords |
頂点/法線/その他は、ローカル座標ではなくワールド座標で変更されます。 |
ensure_correct_normals |
メッシュにuniformではないスケールを適用する場合に使用します。 |
shadows_disabled |
シェーダーで影の計算を無効にします。 |
ambient_light_disabled |
環境光と輝度マップからの影響を無効にします。 |
shadow_to_opacity |
ライティングはアルファを修正し、影のある領域は不透明になり、影のない領域は透明になります。 ARのカメラフィードに影を重ねるのに便利です。 |
vertex_lighting |
頂点ベースのライティングを行います。 |
particle_trails |
パーティクルで使用すると、トレイルが有効になります。 |
alpha_to_coverage |
アルファによるアンチエイリアシングモード。詳細については こちら を参照してください。 |
alpha_to_coverage_and_one |
アルファによるアンチエイリアシングモード。詳細については こちら を参照してください。 |
fog_disabled |
深度ベースまたはボリュームフォグの影響を無効にします。パーティクルなどの blend_add マテリアルを使うときに便利です。 |
ビルトイン
"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、NORMAL、TANGENT、BITANGENT)はローカルモデル空間に表示されます。書き込まれていない場合、これらの値は変更されず、そのまま渡されます。
オプションで、 world_vertex_coords レンダリングモードを使用して、ワールド空間で表示できます。
ユーザーは、ビルトインのmodelview変換を無効にし(投影は後で行われます)、次のコードを使用して手動で実行できます。
shader_type spatial;
render_mode skip_vertex_transform;
void vertex() {
VERTEX = (MODELVIEW_MATRIX * vec4(VERTEX, 1.0)).xyz;
NORMAL = normalize((MODELVIEW_MATRIX * vec4(NORMAL, 0.0)).xyz);
BINORMAL = normalize((MODELVIEW_MATRIX * vec4(BINORMAL, 0.0)).xyz);
TANGENT = normalize((MODELVIEW_MATRIX * vec4(TANGENT, 0.0)).xyz);
}
UV、UV2、COLORなどの他のビルトインも、変更されていない場合はフラグメント関数に渡されます。
ユーザーはビルトインの POSITION を使用して、モデルビューと投影変換をオーバーライドできます。シェーダー内のどこかで POSITION に書き込まれた場合、ユーザーはそれが常に有効値であることを確認する責任があります。 POSITION が使用される場合、 VERTEX の値は無視されプロジェクション計算は行われません。ただしフラグメントシェーダーに渡される値は依然として VERTEX から取得されます。
インスタンス化の場合、INSTANCE_CUSTOM変数にはインスタンスのカスタムデータが含まれます。パーティクルを使用する場合、この情報は通常次のとおりです:
x: ラジアン単位の回転角度。
y: ライフタイム中のフェーズ(0〜1)。
z: アニメーションフレーム。
これにより、デフォルトのパーティクルマテリアルを使用するとき、シェーダをパーティクルシステムに合わせて簡単に調整できます。カスタム パーティクルシェーダを作成する場合、この値は必要に応じて使用できます。
ビルトイン |
説明 |
|---|---|
in vec2 VIEWPORT_SIZE |
ビューポートのサイズ (ピクセル単位)。 |
in mat4 VIEW_MATRIX |
ワールド空間からビュー空間への変換。 |
in mat4 INV_VIEW_MATRIX |
ビュー空間からワールド空間への変換。 |
in mat4 MAIN_CAM_INV_VIEW_MATRIX |
View space to world space transform of camera used to draw the current viewport. |
in mat4 INV_PROJECTION_MATRIX |
クリップ空間からビュー空間への変換。 |
in vec3 NODE_POSITION_WORLD |
ノードのワールド空間の位置。 |
in vec3 NODE_POSITION_VIEW |
ノードのビュー空間の位置。 |
in vec3 CAMERA_POSITION_WORLD |
カメラのワールド空間の位置。 |
in vec3 CAMERA_DIRECTION_WORLD |
カメラのワールド空間の向き。 |
in uint CAMERA_VISIBLE_LAYERS |
Cull layers of the camera rendering the current pass. |
in bool OUTPUT_IS_SRGB |
出力がsRGB色空間で行われる場合は |
in int INSTANCE_ID |
インスタンス化のためのインスタンスID。 |
in vec4 INSTANCE_CUSTOM |
インスタンスのカスタムデータ(主にパーティクル用)。 |
in int VIEW_INDEX |
現在レンダリングしているビューの番号。モノラルレンダリングまたはステレオレンダリングの左目の場合は |
in int VIEW_MONO_LEFT |
モノラルまたは左目の場合の定数で、常に |
in int VIEW_RIGHT |
右目の場合は定数で、常に |
in vec3 EYE_OFFSET |
レンダリングされる際の目の位置のオフセット。ステレオレンダリングでのみ適用されます。 |
inout vec3 VERTEX |
ローカル座標の頂点。 |
in int VERTEX_ID |
頂点バッファー内の現在の頂点インデックス。 |
inout vec3 NORMAL |
ローカル座標での法線。 |
inout vec3 TANGENT |
ローカル座標の接線。 |
inout vec3 BINORMAL |
ローカル座標の従法線。 |
out vec4 POSITION |
書き込まれた場合、最終的な頂点の位置をオーバーライドします。 |
inout vec2 UV |
UVメインチャネル。 |
inout vec2 UV2 |
UVセカンダリチャネル。 |
inout vec4 COLOR |
頂点からの色。 |
out float ROUGHNESS |
頂点ライティング用の粗さ(ラフネス)。 |
inout float POINT_SIZE |
ポイントレンダリングのポイントサイズ。 |
inout mat4 MODELVIEW_MATRIX |
モデル空間からビュー空間への変換(可能な場合は使用)。 |
inout mat3 MODELVIEW_NORMAL_MATRIX |
|
in mat4 MODEL_MATRIX |
モデル空間からワールド空間への変換。 |
in mat3 MODEL_NORMAL_MATRIX |
|
inout mat4 PROJECTION_MATRIX |
ビュー空間からクリップ空間への変換。 |
in uvec4 BONE_INDICES |
|
in vec4 BONE_WEIGHTS |
|
in vec4 CUSTOM0 |
Custom value from vertex primitive. When using extra
UVs, |
in vec4 CUSTOM1 |
Custom value from vertex primitive. When using extra
UVs, |
in vec4 CUSTOM2 |
Custom value from vertex primitive. When using extra
UVs, |
in vec4 CUSTOM3 |
Custom value from vertex primitive. |
注釈
MODELVIEW_MATRIX は MODEL_MATRIX と VIEW_MATRIX の両方を合成したもので、浮動小数点の問題が発生する可能性がある場合に適しています。例えばオブジェクトがワールド原点から非常に離れている場合、分離された MODEL_MATRIX と VIEW_MATRIX を使用すると浮動小数点の問題が発生する可能性があります。
注釈
INV_VIEW_MATRIX is the matrix used for rendering the object in that pass, not like MAIN_CAM_INV_VIEW_MATRIX, which is the matrix of the camera in the scene. In the shadow pass, INV_VIEW_MATRIX's view is based on the camera that is located at the position of the light.
フラグメントプロセッサーのビルトイン
Godotフラグメントプロセッサ関数のデフォルトの用途は、オブジェクトのマテリアルプロパティを設定し、組み込みレンダラーに最終シェーディングを処理させることです。ただし、これらのプロパティをすべて使用する必要はありません。これらのプロパティに書き込みを行わない場合、Godotは対応する機能を最適化します。
ビルトイン |
説明 |
|---|---|
in vec2 VIEWPORT_SIZE |
ビューポートのサイズ (ピクセル単位)。 |
in vec4 FRAGCOORD |
Coordinate of pixel center in screen space. |
in bool FRONT_FACING |
現在の面が正面(面の法線がこちらを向いている)の場合は |
in vec3 VIEW |
フラグメント位置からカメラへの正規化されたベクトル (ビュー空間内)。これは遠近法カメラと直交カメラの両方で同じです。 |
in vec2 UV |
頂点関数からやって来るUV。 |
in vec2 UV2 |
頂点関数からやって来るUV2。 |
in vec4 COLOR |
頂点関数からやって来るCOLOR。 |
in vec2 POINT_COORD |
POINT_SIZEでポイントを描画するためのポイント座標。 |
in bool OUTPUT_IS_SRGB |
出力がsRGB色空間で行われる場合は |
in mat4 MODEL_MATRIX |
モデル空間からワールド空間への変換。 |
in mat3 MODEL_NORMAL_MATRIX |
|
in mat4 VIEW_MATRIX |
ワールド空間からビュー空間への変換。 |
in mat4 INV_VIEW_MATRIX |
ビュー空間からワールド空間への変換。 |
in mat4 PROJECTION_MATRIX |
ビュー空間からクリップ空間への変換。 |
in mat4 INV_PROJECTION_MATRIX |
クリップ空間からビュー空間への変換。 |
in vec3 NODE_POSITION_WORLD |
ワールド空間内のノードの位置。 |
in vec3 NODE_POSITION_VIEW |
ビュー空間内のノードの位置。 |
in vec3 CAMERA_POSITION_WORLD |
ワールド空間内のカメラの位置。 |
in vec3 CAMERA_DIRECTION_WORLD |
ワールド空間内のカメラの方向。 |
in uint CAMERA_VISIBLE_LAYERS |
Cull layers of the camera rendering the current pass. |
in vec3 VERTEX |
頂点関数からの頂点(デフォルト、ビュー空間内)。 |
inout vec3 LIGHT_VERTEX |
ライトとシャドウの計算に使われる位置を変更するための |
in int VIEW_INDEX |
現在レンダリングしているビューの番号。モノラルレンダリングまたはステレオレンダリングの左目の場合は |
in int VIEW_MONO_LEFT |
モノラルまたは左目の場合の定数で、常に |
in int VIEW_RIGHT |
右目の場合は定数で、常に |
in vec3 EYE_OFFSET |
レンダリングされる際の目の位置のオフセット。ステレオレンダリングでのみ適用されます。 |
sampler2D SCREEN_TEXTURE |
Godot 4では削除されました。代わりに |
in vec2 SCREEN_UV |
現在のピクセルのスクリーンUV座標。 |
sampler2D DEPTH_TEXTURE |
Godot 4では削除されました。代わりに |
out float DEPTH |
カスタムの深さの値 (0..1)。 |
inout vec3 NORMAL |
頂点関数からやって来る法線(デフォルト、ビュース空間内)。 |
inout vec3 TANGENT |
頂点関数からやって来る接線。 |
inout vec3 BINORMAL |
頂点関数からやって来る従法線。 |
out vec3 NORMAL_MAP |
NORMALではなくテクスチャから法線を読み取る場合は、ここで法線を設定します。 |
out float NORMAL_MAP_DEPTH |
上記の変数からの深さ。デフォルトは1.0です。 |
out vec3 ALBEDO |
アルベド(デフォルトは白)。 |
out float ALPHA |
アルファ値(0..1); これに書き込まれた場合、マテリアルは半透明パイプラインに送られます。 |
out float ALPHA_SCISSOR_THRESHOLD |
書き込まれた場合、一定量のアルファ以下の値は破棄されます。 |
out float ALPHA_HASH_SCALE |
|
out float ALPHA_ANTIALIASING_EDGE |
|
out vec2 ALPHA_TEXTURE_COORDINATE |
|
out float METALLIC |
メタリック(0..1)。 |
out float SPECULAR |
スペキュラー。デフォルトは0.5で、IORを変更しない限り変更しないことをお勧めします。 |
out float ROUGHNESS |
粗さ(0..1)。 |
out float RIM |
リム(0..1)。使用すると、Godotはリム照明を計算します。 |
out float RIM_TINT |
リムティントは、0(白)から1(アルベド)に移行します。使用すると、Godotはリム照明を計算します。 |
out float CLEARCOAT |
小さな追加のスペキュラーblob。使用すると、Godotはクリアコートを計算します。 |
out float CLEARCOAT_GLOSS |
クリアコートの光沢。使用すると、Godotはクリアコートを計算します。 |
out float ANISOTROPY |
接線空間に応じてスペキュラーblobを歪ませます。 |
out vec2 ANISOTROPY_FLOW |
歪みの方向。フローマップで使用します。 |
out float SSS_STRENGTH |
サブサーフェススキャッタリングの強度。使用すると、サブサーフェススキャッタリングがオブジェクトに適用されます。 |
out vec4 SSS_TRANSMITTANCE_COLOR |
|
out float SSS_TRANSMITTANCE_DEPTH |
|
out float SSS_TRANSMITTANCE_BOOST |
|
inout vec3 BACKLIGHT |
|
out float AO |
アンビエントオクルージョンの強度。プリベイクドAOで使用します。 |
out float AO_LIGHT_AFFECT |
ライトに影響するAOの量(0..1; デフォルトは0)。 |
out vec3 EMISSION |
発光色(HDRの場合は1,1,1を超えることができます)。 |
out vec4 FOG |
書き込まれた場合、FOG.a に基づいて最終ピクセルカラーを FOG.rgb とブレンドします。 |
out vec4 RADIANCE |
書き込まれた場合、RADIANCE.a に基づいて環境マップの放射輝度を RADIANCE.rgb とブレンドします。 |
out vec4 IRRADIANCE |
書き込まれた場合、環境マップ放射照度を IRRADIANCE.a に基づいて IRRADIANCE.rgb とブレンドします。 |
注釈
ALPHA が書き込まれるときに半透明パイプラインを通過するシェーダーは、透明度のソートの問題を引き起こす可能性があります。詳細と問題を回避する方法については、3Dレンダリングの制限 - 透明度の並べ替え をお読みください。
ライトプロセッサーのビルトイン
ライトプロセッサ関数の記述は完全にオプションです。 render_modeを ``unshaded``に設定すると、ライト関数をスキップできます。ライト関数が記述されていない場合、Godotはフラグメント関数に書き込まれたマテリアルプロパティを使用して、ライティングを計算します(render_modeに従います)。
ライト関数は、すべてのピクセルのすべてのライトに対して呼び出されます。各ライトタイプのループ内で呼び出されます。
以下は、ランバート照明モデルを使用したカスタムライト関数の例です:
void light() {
DIFFUSE_LIGHT += clamp(dot(NORMAL, LIGHT), 0.0, 1.0) * ATTENUATION * LIGHT_COLOR;
}
ライトを一緒に追加する場合は、上書きするのではなく、+= を使用して DIFFUSE_LIGHT にライトの関与を追加します。
警告
vertex_lighting レンダリングモードが有効になっている、またはプロジェクト設定で レンダリング > シェーディング > 頂点シェーディングの強制 が有効になっている場合、 light() 関数は実行されません。 (モバイルプラットフォームではデフォルトで強制になっています。)
ビルトイン |
説明 |
|---|---|
in vec2 VIEWPORT_SIZE |
ビューポートのサイズ (ピクセル単位)。 |
in vec4 FRAGCOORD |
画面空間のピクセル中心の座標。 |
in mat4 MODEL_MATRIX |
モデル空間からワールド空間への変換。 |
in mat4 INV_VIEW_MATRIX |
ビュー空間からワールド空間への変換。 |
in mat4 VIEW_MATRIX |
ワールド空間からビュー空間への変換。 |
in mat4 PROJECTION_MATRIX |
ビュー空間からクリップ空間への変換。 |
in mat4 INV_PROJECTION_MATRIX |
クリップ空間からビュー空間への変換。 |
in vec3 NORMAL |
ビュー空間内の法線ベクトル。 |
in vec2 UV |
頂点関数からやって来るUV。 |
in vec2 UV2 |
頂点関数からやって来るUV2。 |
in vec3 VIEW |
ビュー空間内のカメラ視線ベクトル。 |
in vec3 LIGHT |
ビュー空間内のライトベクトル。 |
in vec3 LIGHT_COLOR |
光の色に |
in float SPECULAR_AMOUNT |
|
in bool LIGHT_IS_DIRECTIONAL |
|
in float ATTENUATION |
距離または影に基づく減衰。 |
in vec3 ALBEDO |
ベースアルベド。 |
in vec3 BACKLIGHT |
|
in float METALLIC |
メタリック (金属感)。 |
in float ROUGHNESS |
ラフネス (粗さ)。 |
in bool OUTPUT_IS_SRGB |
出力がsRGB色空間で行われる場合は |
out vec3 DIFFUSE_LIGHT |
拡散反射光の結果。 |
out vec3 SPECULAR_LIGHT |
鏡面反射光の結果。 |
out float ALPHA |
アルファ(0..1); 書き込まれた場合、マテリアルはtransparentパイプラインに送られます。 |
注釈
ALPHA が書き込まれるときに半透明パイプラインを通過するシェーダーは、透明度のソートの問題を引き起こす可能性があります。詳細と問題を回避する方法については、3Dレンダリングの制限 - 透明度の並べ替え をお読みください。
半透明なマテリアルは影を落としたり、 hint_screen_texture や hint_depth_texture のUniformに表示したりすることもできません。これにより半透明マテリアルがスクリーン空間の反射や屈折に現れるのを防ぎます。 SDFGI 半透明なマテリアルでは鋭い反射は表示されません (半透明なマテリアルでは粗い反射のみが表示されます)。