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 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.

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

頂点データ(VERTEXNORMALTANGENTBITANGENT)はローカルモデル空間に表示されます。書き込まれていない場合、これらの値は変更されず、そのまま渡されます。

オプションで、 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色空間で行われる場合は true (互換性レンダラーでは true 、Forward+レンダラーおよびモバイルレンダラーでは false ) です。

in int INSTANCE_ID

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

in vec4 INSTANCE_CUSTOM

インスタンスのカスタムデータ(主にパーティクル用)。

in int VIEW_INDEX

現在レンダリングしているビューの番号。モノラルレンダリングまたはステレオレンダリングの左目の場合は VIEW_MONO_LEFT (0)、ステレオレンダリングの右目の場合は VIEW_RIGHT (1) です。

in int VIEW_MONO_LEFT

モノラルまたは左目の場合の定数で、常に 0 です。

in int VIEW_RIGHT

右目の場合は定数で、常に 1 になります。

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, xy is UV3 and zw is UV4.

in vec4 CUSTOM1

Custom value from vertex primitive. When using extra UVs, xy is UV5 and zw is UV6.

in vec4 CUSTOM2

Custom value from vertex primitive. When using extra UVs, xy is UV7 and zw is UV8.

in vec4 CUSTOM3

Custom value from vertex primitive.

注釈

MODELVIEW_MATRIXMODEL_MATRIXVIEW_MATRIX の両方を合成したもので、浮動小数点の問題が発生する可能性がある場合に適しています。例えばオブジェクトがワールド原点から非常に離れている場合、分離された MODEL_MATRIXVIEW_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. xy specifies position in window. Origin is lower left. z specifies fragment depth. It is also used as the output value for the fragment depth unless DEPTH is written to.

in bool FRONT_FACING

現在の面が正面(面の法線がこちらを向いている)の場合は true

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色空間で行われる場合は true (互換性レンダラーでは true 、Forward+レンダラーおよびモバイルレンダラーでは false ) です。

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

ライトとシャドウの計算に使われる位置を変更するための VERTEX の書き込み可能なバージョン。これに書き込んでもフラグメント自体の位置は変わりません。

in int VIEW_INDEX

現在レンダリングしているビューの番号。モノラルレンダリングまたはステレオレンダリングの左目の場合は VIEW_MONO_LEFT (0)、ステレオレンダリングの右目の場合は VIEW_RIGHT (1) です。

in int VIEW_MONO_LEFT

モノラルまたは左目の場合の定数で、常に 0 です。

in int VIEW_RIGHT

右目の場合は定数で、常に 1 になります。

in vec3 EYE_OFFSET

レンダリングされる際の目の位置のオフセット。ステレオレンダリングでのみ適用されます。

sampler2D SCREEN_TEXTURE

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

in vec2 SCREEN_UV

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

sampler2D DEPTH_TEXTURE

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

out float DEPTH

カスタムの深さの値 (0..1)。 DEPTH がシェーダーのいずれかのブランチで書き込まれている場合、他の すべて のブランチでも DEPTH を設定する必要があります。そうしないとグラフィックスAPIは初期化されないままになります。

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

画面空間のピクセル中心の座標。xy はウィンドウ内の位置を指定し、zDEPTH を使用しない場合のフラグメントの深さを指定します。原点は左下です。

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

光の色に エネルギー * PI を掛けたもの。物理ベースの照明モデルには PI による除算が含まれるため、 PI が乗算されます。

in float SPECULAR_AMOUNT

OmniLight3D もしくは SpotLight3D の場合は 2.0 * light_specular プロパティ。 DirectionalLight3D の場合は1.0。

in bool LIGHT_IS_DIRECTIONAL

DirectionalLight3D の場合は true

in float ATTENUATION

距離または影に基づく減衰。

in vec3 ALBEDO

ベースアルベド。

in vec3 BACKLIGHT

in float METALLIC

メタリック (金属感)。

in float ROUGHNESS

ラフネス (粗さ)。

in bool OUTPUT_IS_SRGB

出力がsRGB色空間で行われる場合は true (互換性レンダラーでは true 、Forward+レンダラーおよびモバイルレンダラーでは false ) です。

out vec3 DIFFUSE_LIGHT

拡散反射光の結果。

out vec3 SPECULAR_LIGHT

鏡面反射光の結果。

out float ALPHA

アルファ(0..1); 書き込まれた場合、マテリアルはtransparentパイプラインに送られます。

注釈

ALPHA が書き込まれるときに半透明パイプラインを通過するシェーダーは、透明度のソートの問題を引き起こす可能性があります。詳細と問題を回避する方法については、3Dレンダリングの制限 - 透明度の並べ替え をお読みください。

半透明なマテリアルは影を落としたり、 hint_screen_texturehint_depth_texture のUniformに表示したりすることもできません。これにより半透明マテリアルがスクリーン空間の反射や屈折に現れるのを防ぎます。 SDFGI 半透明なマテリアルでは鋭い反射は表示されません (半透明なマテリアルでは粗い反射のみが表示されます)。