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のカメラフィードに影を重ねるのに便利です。

Built-ins

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

Global built-ins

Global built-ins are available everywhere, including custom functions.

ビルトイン

説明

in float TIME

秒単位のグローバル時間。

頂点用ビルトイン

頂点データ(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);
    // 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: アニメーションフレーム。

This allows you to easily adjust the shader to a particle system using default particles material. When writing a custom particle shader, this value can be used as desired.

ビルトイン

説明

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

クリップ空間からビュー空間への変換。

in vec3 NODE_POSITION_WORLD

Node position, in world space.

in vec3 NODE_POSITION_VIEW

Node position, in view space.

in vec3 CAMERA_POSITION_WORLD

Camera position, in world space.

in vec3 CAMERA_DIRECTION_WORLD

Camera direction, in world space.

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

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

注釈

MODELVIEW_MATRIX combines both the WORLD_MATRIX and INV_CAMERA_MATRIX and is better suited when floating point issues may arise. For example, if the object is very far away from the world origin, you may run into floating point issues when using the seperated WORLD_MATRIX and INV_CAMERA_MATRIX.

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

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

ビルトイン

説明

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 NODE_POSITION_WORLD

Node world space position.

in vec3 NODE_POSITION_VIEW

Node view space position.

in vec3 CAMERA_POSITION_WORLD

Camera world space position.

in vec3 CAMERA_DIRECTION_WORLD

Camera world space direction.

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

Custom depth value (0..1). If DEPTH is being written to in any shader branch, then you are responsible for setting the DEPTH for all other branches. Otherwise, the graphics API will leave them uninitialized.

in vec2 SCREEN_UV

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

in vec2 POINT_COORD

POINT_SIZEでポイントを描画するためのポイント座標。

注釈

Shaders going through the transparent pipeline when ALPHA is written to may exhibit transparency sorting issues. Read the transparency sorting section in the 3D rendering limitations page for more information and ways to avoid issues.

ライト用ビルトイン

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

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

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

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

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

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

警告

In GLES2, lights will always be added together even if you override DIFFUSE_LIGHT using =. This is due to lighting being computed in multiple passes (one for each light), unlike GLES3.

警告

The light() function won't be run if the vertex_lighting render mode is enabled, or if Rendering > Quality > Shading > Force Vertex Shading is enabled in the Project Settings. (It's enabled by default on mobile platforms.)

ビルトイン

説明

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

Color of light multiplied by energy * PI. The PI multiplication is present because physically-based lighting models include a division by PI.

out float ALPHA

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

in float ROUGHNESS

粗さ。

in vec3 TRANSMISSION

フラグメント関数からのトランスミッションマスク(チャンネルマスク)。

out vec3 DIFFUSE_LIGHT

拡散光の結果。

out vec3 SPECULAR_LIGHT

スペキュラー光の結果。

注釈

Shaders going through the transparent pipeline when ALPHA is written to may exhibit transparency sorting issues. Read the transparency sorting section in the 3D rendering limitations page for more information and ways to avoid issues.