Spatial(空間)シェーダー

Spatialシェーダーは、3Dオブジェクトのシェーディングに使用されます。 Godotが提供するシェーダーの中で最も複雑なタイプです。Spatialシェーダーは、さまざまなレンダリングモードとさまざまなレンダリングオプション(たとえば、サブサーフェース散乱、透過、アンビエントオクルージョン、リム照明など)で高度に構成できます。オプションで、頂点、フラグメント、ライトプロセッサ関数を記述して、オブジェクトの描画方法に影響を与えることができます。

レンダリングモード

レンダリングモード 説明
blend_mix ミックスブレンドモード(アルファは透明度)、デフォルト。
blend_add 加算ブレンドモード。
blend_sub 減算ブレンドモード。
blend_mul 乗法ブレンドモード。
depth_draw_opaque 不透明なジオメトリに対してのみ深度を描画します(透明ではありません)。
depth_draw_always 常に深度を描画します(不透明および透明)。
depth_draw_never 深度の描画をしません。
depth_draw_alpha_prepass 透明なジオメトリの不透明な深さの事前パスを行います。
depth_test_disable 深度テストを無効にします。
cull_front 前面(法線が視点の方向に向いている)を間引きます。
cull_back 背面(法線が視点と逆方向に向いている)を間引きます(デフォルト)。
cull_disabled カリングは無効です(両面を描画)。
unshaded 結果は単なるアルベドです。マテリアルではライティング/シェーディングは発生しません。
diffuse_lambert 拡散をランバートシェーディングに(デフォルト)。
diffuse_lambert_wrap 拡散をランバートラッピングに(回り込みはroughnessに依存)。
diffuse_oren_nayar 拡散をオーレン・ネイヤーに。
diffuse_burley 拡散をバーリー(ディズニーPBS)に。
diffuse_toon 拡散をトゥーンシェーディングに。
specular_schlick_ggx スペキュラーをSchlick-GGXに(デフォルト)。
specular_blinn スペキュラーをブリンに(互換性が高い)。
specular_phong スペキュラーをフォンに(互換性が高い)。
specular_toon スペキュラーをトゥーンに。
specular_disabled スペキュラーを無効にします。
skip_vertex_transform VERTEX/NORMAL/その他を、頂点関数で手動で変換する必要があります。
world_vertex_coords 頂点/法線/その他は、ローカル座標ではなくワールド座標で変更されます。
ensure_correct_normals メッシュにuniformではないスケールを適用する場合に使用します。
vertex_lighting 頂点ベースの照明を使用します。
shadows_disabled シェーダーで影の計算を無効にします。
ambient_light_disabled 環境光と輝度マップからの影響を無効にします。
shadow_to_opacity ライティングはアルファを修正し、影のある領域は不透明になり、影のない領域は透明になります。 ARのカメラフィードに影を重ねるのに便利です。

頂点用ビルトイン

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

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

オプションで、*world_vertex_coords * レンダリングモードを使用して、ワールド空間で表示できます。

ユーザーは、ビルトインのmodelview変換を無効にし(投影は後で行われます)、次のコードを使用して手動で実行できます。

shader_type spatial;
render_mode skip_vertex_transform;

void vertex() {
    VERTEX = (MODELVIEW_MATRIX * vec4(VERTEX, 1.0)).xyz;
    NORMAL = (MODELVIEW_MATRIX * vec4(NORMAL, 0.0)).xyz;
    // same as above for binormal and tangent, if normal mapping is used
}

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

ユーザーは、組み込みの POSITION を使用して、モデルビューと投影変換をオーバーライドできます。POSITION を使用すると、VERTEX の値は無視され、投影は行われません。ただし、フラグメントシェーダーに渡される値は、引き続き VERTEX から取得されます。

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

  • x: ラジアン単位の回転角度。
  • y: ライフタイム中のフェーズ(0〜1)。
  • z: アニメーションフレーム。

これにより、デフォルトのパーティクルマテリアルを使用して、シェーダーをパーティクルシステムに合わせて簡単に調整できます。カスタムパーティクルシェーダーを記述する場合、この値は必要に応じて使用できます。

ビルトイン 説明
in float TIME 経過した合計時間(秒単位)。
in vec2 VIEWPORT_SIZE ビューポートのサイズ (ピクセル単位)。
inout mat4 WORLD_MATRIX モデル空間からワールド空間への変換。
in mat4 INV_CAMERA_MATRIX ワールド空間からビュー空間への変換。
inout mat4 PROJECTION_MATRIX ビュー空間からクリップ空間への変換。
in mat4 CAMERA_MATRIX ビュー空間からワールド空間への変換。
inout mat4 MODELVIEW_MATRIX モデル空間からビュー空間への変換(可能な場合は使用)。
inout mat4 INV_PROJECTION_MATRIX クリップ空間からビュー空間への変換。
inout vec3 VERTEX ローカル座標の頂点。
out vec4 POSITION 書き込まれた場合、最終的な頂点の位置をオーバーライドします。
inout vec3 NORMAL ローカル座標での法線。
inout vec3 TANGENT ローカル座標の接線。
inout vec3 BINORMAL ローカル座標の従法線。
out float ROUGHNESS 頂点ライティング用の粗さ。
inout vec2 UV UVメインチャネル。
inout vec2 UV2 UVセカンダリチャネル。
in bool OUTPUT_IS_SRGB 計算がsRGB色空間で行われる場合は true``(GLES2では ``true、GLES3では false)。
inout vec4 COLOR 頂点からの色。
inout float POINT_SIZE ポイントレンダリングのポイントサイズ。
in int INSTANCE_ID インスタンス化のためのインスタンスID。
in vec4 INSTANCE_CUSTOM インスタンスのカスタムデータ(主にパーティクル用)。

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

Godotフラグメントプロセッサ関数のデフォルトの用途は、オブジェクトのマテリアルプロパティを設定し、組み込みレンダラーに最終シェーディングを処理させることです。ただし、これらのプロパティをすべて使用する必要はありません。これらのプロパティに書き込みを行わない場合、Godotは対応する機能を最適化します。

ビルトイン 説明
in float TIME 経過した合計時間(秒単位)。
in vec2 VIEWPORT_SIZE ビューポートのサイズ (ピクセル単位)。
in vec4 FRAGCOORD 画面空間のピクセル中心の座標。xy はウィンドウ内の位置を指定し、zDEPTH を使用しない場合のフラグメントの深さを指定します。原点は左下です。
in mat4 WORLD_MATRIX モデル空間からワールド空間への変換。
in mat4 INV_CAMERA_MATRIX ワールド空間からビュー空間への変換。
in mat4 CAMERA_MATRIX ビュー空間からワールド空間への変換。
in mat4 PROJECTION_MATRIX ビュー空間からクリップ空間への変換。
in mat4 INV_PROJECTION_MATRIX クリップ空間からビュー空間への変換。
in vec3 VERTEX 頂点関数からの頂点(デフォルト、ビュー空間内)。
in vec3 VIEW カメラからフラグメント位置へのベクトル(ビュー空間内)。
in bool FRONT_FACING 現在の面が前面(面の法線がこちらを向いている)の場合は true
inout vec3 NORMAL 頂点関数からやって来る法線(デフォルト、ビュース空間内)。
inout vec3 TANGENT 頂点関数からやって来る接線。
inout vec3 BINORMAL 頂点関数からやって来る従法線。
out vec3 NORMALMAP NORMALではなくテクスチャから法線を読み取る場合は、ここで法線を設定します。
out float NORMALMAP_DEPTH 上記の変数からの深さ。デフォルトは1.0です。
in vec2 UV 頂点関数からやって来るUV。
in vec2 UV2 頂点関数からやって来るUV2。
in bool OUTPUT_IS_SRGB 計算がsRGB色空間で行われる場合は true``(GLES2では ``true、GLES3では false)。
in vec4 COLOR 頂点関数からやって来るCOLOR。
out vec3 ALBEDO アルベド(デフォルトは白)。
out float ALPHA アルファ(0..1); 書き込まれた場合、マテリアルはtransparentパイプラインに送られます。
out float ALPHA_SCISSOR 書き込まれた場合、一定量のアルファ以下の値は破棄されます。
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 vec3 TRANSMISSION トランスミッションマスク(デフォルトは0,0,0)。光がオブジェクトを通過できるようにします。使用する場合にのみ適用されます。
out vec3 EMISSION 発光色(HDRの場合は1,1,1を超えることができます)。
out float AO アンビエントオクルージョンの強度。プリベイクドAOで使用します。
out float AO_LIGHT_AFFECT ライトに影響するAOの量(0..1; デフォルトは0)。
sampler2D SCREEN_TEXTURE 画面から読み取るための組み込みのテクスチャ。ミップマップには、だんだんとぼやけて行くコピーが含まれます。
sampler2D DEPTH_TEXTURE 画面から深度を読み取るための組み込みテクスチャ。 INV_PROJECTIONを使用して線形に変換する必要があります。
out float DEPTH カスタム深度値(0..1)。
in vec2 SCREEN_UV 現在のピクセルのスクリーンUV座標。
in vec2 POINT_COORD POINT_SIZEでポイントを描画するためのポイント座標。

ライト用ビルトイン

ライトプロセッサ関数の記述は完全にオプションです。 render_modeを ``unshaded``に設定すると、ライト関数をスキップできます。ライト関数が記述されていない場合、Godotはフラグメント関数に書き込まれたマテリアルプロパティを使用して、ライティングを計算します(render_modeに従います)。

ライト関数を作成するには、DIFFUSE_LIGHT または SPECULAR_LIGHT に何かを割り当てます。何も割り当てないことは、ライトが処理されないことを意味します。

ライト関数は、すべてのピクセルのすべてのライトに対して呼び出されます。各ライトタイプのループ内で呼び出されます。

以下は、ランバート照明モデルを使用したカスタムライト関数の例です:

void light() {
    DIFFUSE_LIGHT += dot(NORMAL, LIGHT) * ATTENUATION * ALBEDO;
}

ライトを一緒に追加する場合は、上書きするのではなく、+= を使用して DIFFUSE_LIGHT にライトの関与を追加します。

ビルトイン 説明
in float TIME 経過した合計時間(秒単位)。
in vec2 VIEWPORT_SIZE ビューポートのサイズ (ピクセル単位)。
in vec4 FRAGCOORD 画面空間のピクセル中心の座標。xy はウィンドウ内の位置を指定し、zDEPTH を使用しない場合のフラグメントの深さを指定します。原点は左下です。
in mat4 WORLD_MATRIX モデル空間からワールド空間への変換。
in mat4 INV_CAMERA_MATRIX ワールド空間からビュー空間への変換。
in mat4 CAMERA_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 ATTENUATION 距離または影に基づく減衰。
in bool OUTPUT_IS_SRGB 計算がsRGB色空間で行われる場合は true``(GLES2では ``true、GLES3では false)。
in vec3 ALBEDO ベースアルベド。
in vec3 LIGHT_COLOR ライトの色にエネルギーを掛けたもの。
out float ALPHA アルファ(0..1); 書き込まれた場合、マテリアルはtransparentパイプラインに送られます。
in float ROUGHNESS 粗さ。
in vec3 TRANSMISSION フラグメント関数からのトランスミッションマスク(チャンネルマスク)。
out vec3 DIFFUSE_LIGHT 拡散光の結果。
out vec3 SPECULAR_LIGHT スペキュラー光の結果。