Spatial(3D)シェーダー
Spatialシェーダーは、3Dオブジェクトのシェーディングに使用されます。 Godotが提供するシェーダーの中で最も複雑なタイプです。Spatialシェーダーは、さまざまなレンダリングモードとさまざまなレンダリングオプション(たとえば、サブサーフェース散乱、透過、アンビエントオクルージョン、リム照明など)で高度に構成できます。オプションで、頂点、フラグメント、ライトプロセッサ関数を記述して、オブジェクトの描画方法に影響を与えることができます。
レンダリングモード
For visual examples of these render modes, see Standard Material 3D and ORM Material 3D.
レンダリングモード |
説明 |
|---|---|
blend_mix |
ミックスブレンドモード(アルファは透明度)、デフォルト。 |
blend_add |
加算ブレンドモード。 |
blend_sub |
減算ブレンドモード。 |
blend_mul |
乗法ブレンドモード。 |
blend_premul_alpha |
Premultiplied alpha blend mode (fully transparent = add, fully opaque = mix). |
depth_draw_opaque |
不透明なジオメトリに対してのみ深度を描画します(透明ではありません)。 |
depth_draw_always |
常に深度を描画します(不透明および透明)。 |
depth_draw_never |
深度の描画をしません。 |
depth_prepass_alpha |
半透明ジオメトリでも深さの事前パス(デプスプリパス)を行います。 |
depth_test_disabled |
深度テストを無効にします。 |
sss_mode_skin |
Subsurface Scattering mode for skin (optimizes visuals for human skin, e.g. boosted red channel). |
cull_back |
背面(法線が視点と逆方向に向いている)を間引きます(デフォルト)。 |
cull_front |
前面(法線が視点の方向に向いている)を間引きます。 |
cull_disabled |
カリングは無効です(両面を描画)。 |
unshaded |
Result is just albedo. No lighting/shading happens in material, making it faster to render. |
wireframe |
Geometry draws using lines (useful for troubleshooting). |
debug_shadow_splits |
Directional shadows are drawn using different colors for each split (useful for troubleshooting). |
diffuse_burley |
拡散反射を物理ベース Burley (Disney PBS) で計算します (デフォルト)。 |
diffuse_lambert |
拡散反射をランバートシェーディングで計算します。 |
diffuse_lambert_wrap |
Lambert-wrap shading (roughness-dependent) for diffuse. |
diffuse_toon |
拡散反射をトゥーンシェーディングで計算します。 |
specular_schlick_ggx |
Schlick-GGX for direct light specular lobes (default). |
specular_toon |
Toon for direct light specular lobes. |
specular_disabled |
Disable direct light specular lobes. Doesn't affect reflected light (use |
skip_vertex_transform |
|
world_vertex_coords |
|
ensure_correct_normals |
Use when non-uniform scale is applied to mesh (note: currently unimplemented). |
shadows_disabled |
Disable computing shadows in shader. The shader will not receive shadows, but can still cast them. |
ambient_light_disabled |
環境光と輝度マップからの影響を無効にします。 |
shadow_to_opacity |
ライティングはアルファを修正し、影のある領域は不透明になり、影のない領域は透明になります。 ARのカメラフィードに影を重ねるのに便利です。 |
vertex_lighting |
Use vertex-based lighting instead of per-pixel lighting. |
particle_trails |
パーティクルで使用すると、トレイルが有効になります。 |
alpha_to_coverage |
アルファによるアンチエイリアシングモード。詳細については こちら を参照してください。 |
alpha_to_coverage_and_one |
アルファによるアンチエイリアシングモード。詳細については こちら を参照してください。 |
fog_disabled |
Disable receiving depth-based or volumetric fog. Useful for |
ビルトイン
Values marked as in are read-only. Values marked as out can optionally be written to and will
not necessarily contain sensible values. Values marked as inout provide a sensible default
value, and can optionally be written to. Samplers cannot be written to so they are not marked.
Not all built-ins are available in all processing functions. To access a vertex
built-in from the fragment() function, you can use a varying.
The same applies for accessing fragment built-ins from the light() function.
グローバルビルトイン
グローバルビルトインは、カスタム関数を含め、どこでも使用できます。
ビルトイン |
説明 |
|---|---|
in float TIME |
Global time since the engine has started, in seconds. It repeats after every |
in float PI |
|
in float TAU |
定数 TAU` は円周率の2倍 ( |
in float E |
An |
in bool OUTPUT_IS_SRGB |
|
in float CLIP_SPACE_FAR |
Clip space far |
頂点プロセッサーのビルトイン
Vertex data (VERTEX, NORMAL, TANGENT, and BITANGENT) are presented in model space
(also called local space). If not written to, these values will not be modified and be
passed through as they came, then transformed into view space to be used in fragment().
They can optionally be presented in world space by using the world_vertex_coords render mode.
ユーザーは、ビルトインの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);
}
Other built-ins, such as UV, UV2, and COLOR, are also passed through to the fragment() function if not modified.
ユーザーはビルトインの POSITION を使用して、モデルビューと投影変換をオーバーライドできます。シェーダー内のどこかで POSITION に書き込まれた場合、ユーザーはそれが常に有効値であることを確認する責任があります。 POSITION が使用される場合、 VERTEX の値は無視されプロジェクション計算は行われません。ただしフラグメントシェーダーに渡される値は依然として VERTEX から取得されます。
For instancing, the INSTANCE_CUSTOM variable contains the instance custom data. When using particles, this information
is usually:
x: ラジアン単位の回転角度。
y: Phase during lifetime (
0.0to1.0).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 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 |
Position of the vertex, in model space.
In world space if |
in int VERTEX_ID |
頂点バッファー内の現在の頂点インデックス。 |
inout vec3 NORMAL |
Normal in model space.
In world space if |
inout vec3 TANGENT |
Tangent in model space.
In world space if |
inout vec3 BINORMAL |
Binormal in model space.
In world space if |
out vec4 POSITION |
If written to, overrides final vertex position in clip space. |
inout vec2 UV |
UVメインチャネル。 |
inout vec2 UV2 |
UVセカンダリチャネル。 |
inout vec4 COLOR |
頂点からの色。 |
out float ROUGHNESS |
頂点ライティング用の粗さ(ラフネス)。 |
inout float POINT_SIZE |
ポイントレンダリングのポイントサイズ。 |
inout mat4 MODELVIEW_MATRIX |
Model/local space to view space transform (use if possible). |
inout mat3 MODELVIEW_NORMAL_MATRIX |
|
in mat4 MODEL_MATRIX |
Model/local space to world space transform. |
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, unlike 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 that comes from the |
in vec2 UV2 |
UV2 that comes from the |
in vec4 COLOR |
COLOR that comes from the |
in vec2 POINT_COORD |
Point coordinate for drawing points with |
in mat4 MODEL_MATRIX |
Model/local space to world space transform. |
in mat3 MODEL_NORMAL_MATRIX |
Model/local space to world space transform for normals. This is the same as |
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 |
Position of the fragment (pixel), in view space. It is the |
inout vec3 LIGHT_VERTEX |
ライトとシャドウの計算に使われる位置を変更するための |
in int VIEW_INDEX |
The view that we are rendering. Used to distinguish between views in multiview/stereo rendering.
|
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 |
Custom depth value (range of |
inout vec3 NORMAL |
Normal that comes from the |
inout vec3 TANGENT |
Tangent that comes from the |
inout vec3 BINORMAL |
Binormal that comes from the |
out vec3 NORMAL_MAP |
Set normal here if reading normal from a texture instead of |
out float NORMAL_MAP_DEPTH |
Depth from |
out vec3 ALBEDO |
Albedo (default white). Base color. |
out float ALPHA |
Alpha (range of |
out float ALPHA_SCISSOR_THRESHOLD |
書き込まれた場合、一定量のアルファ以下の値は破棄されます。 |
out float ALPHA_HASH_SCALE |
Alpha hash scale when using the alpha hash transparency mode. Defaults to |
out float ALPHA_ANTIALIASING_EDGE |
The threshold below which alpha to coverage antialiasing should be used. Defaults to |
out vec2 ALPHA_TEXTURE_COORDINATE |
The texture coordinate to use for alpha-to-coverge antialiasing. Requires the
|
out float PREMUL_ALPHA_FACTOR |
Premultiplied alpha factor. Only effective if |
out float METALLIC |
Metallic (range of |
out float SPECULAR |
Specular (not physically accurate to change). Defaults to |
out float ROUGHNESS |
Roughness (range of |
out float RIM |
Rim (range of |
out float RIM_TINT |
Rim Tint, range of |
out float CLEARCOAT |
Small specular blob added on top of the existing one. If used, Godot calculates clearcoat. |
out float CLEARCOAT_GLOSS |
Gloss of clearcoat. If used, Godot calculates clearcoat. |
out float ANISOTROPY |
接線空間に応じてスペキュラーblobを歪ませます。 |
out vec2 ANISOTROPY_FLOW |
歪みの方向。フローマップで使用します。 |
out float SSS_STRENGTH |
Strength of subsurface scattering. If used, subsurface scattering will be applied to the object. |
out vec4 SSS_TRANSMITTANCE_COLOR |
Color of subsurface scattering transmittance. If used, subsurface scattering transmittance will be applied to the object. |
out float SSS_TRANSMITTANCE_DEPTH |
Depth of subsurface scattering transmittance. Higher values allow the effect to reach deeper into the object. |
out float SSS_TRANSMITTANCE_BOOST |
Boosts the subsurface scattering transmittance if set above |
inout vec3 BACKLIGHT |
Color of backlighting (works like direct light, but it's received even if the normal is slightly facing away from the light). If used, backlighting will be applied to the object. Can be used as a cheaper approximation of subsurface scattering. |
out float AO |
Strength of ambient occlusion. For use with pre-baked AO. |
out float AO_LIGHT_AFFECT |
How much ambient occlusion affects direct light (range of |
out vec3 EMISSION |
Emission color (can go over |
out vec4 FOG |
If written to, blends final pixel color with |
out vec4 RADIANCE |
If written to, blends environment map radiance with |
out vec4 IRRADIANCE |
If written to, blends environment map irradiance with |
注釈
ALPHA が書き込まれるときに半透明パイプラインを通過するシェーダーは、透明度のソートの問題を引き起こす可能性があります。詳細と問題を回避する方法については、3Dレンダリングの制限 - 透明度の並べ替え をお読みください。
ライトプロセッサーのビルトイン
Writing light processor functions is completely optional. You can skip the light() function by using
the unshaded render mode. If no light function is written, Godot will use the material properties
written to in the fragment() function to calculate the lighting for you (subject to the render mode).
The light() function is called for every light in every pixel. It is called within a loop for each light type.
Below is an example of a custom light() function using a Lambertian lighting model:
void light() {
DIFFUSE_LIGHT += clamp(dot(NORMAL, LIGHT), 0.0, 1.0) * ATTENUATION * LIGHT_COLOR / PI;
}
ライトを一緒に追加する場合は、上書きするのではなく、+= を使用して DIFFUSE_LIGHT にライトの関与を追加します。
警告
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 vec2 VIEWPORT_SIZE |
ビューポートのサイズ (ピクセル単位)。 |
in vec4 FRAGCOORD |
画面空間のピクセル中心の座標。 |
in mat4 MODEL_MATRIX |
Model/local space to world space transform. |
in mat4 INV_VIEW_MATRIX |
ビュー空間からワールド空間への変換。 |
in mat4 VIEW_MATRIX |
ワールド空間からビュー空間への変換。 |
in mat4 PROJECTION_MATRIX |
ビュー空間からクリップ空間への変換。 |
in mat4 INV_PROJECTION_MATRIX |
クリップ空間からビュー空間への変換。 |
in vec3 NORMAL |
ビュー空間内の法線ベクトル。 |
in vec2 SCREEN_UV |
現在のピクセルのスクリーンUV座標。 |
in vec2 UV |
UV that comes from the |
in vec2 UV2 |
UV2 that comes from the |
in vec3 VIEW |
ビュー空間内のカメラ視線ベクトル。 |
in vec3 LIGHT |
Light vector, in view space. |
in vec3 LIGHT_COLOR |
Light color multiplied by
light energy multiplied by
|
in float SPECULAR_AMOUNT |
For OmniLight3D and SpotLight3D,
|
in bool LIGHT_IS_DIRECTIONAL |
|
in float ATTENUATION |
距離または影に基づく減衰。 |
in vec3 ALBEDO |
ベースアルベド。 |
in vec3 BACKLIGHT |
|
in float METALLIC |
メタリック (金属感)。 |
in float ROUGHNESS |
ラフネス (粗さ)。 |
out vec3 DIFFUSE_LIGHT |
拡散反射光の結果。 |
out vec3 SPECULAR_LIGHT |
鏡面反射光の結果。 |
out float ALPHA |
Alpha (range of |
注釈
ALPHA が書き込まれるときに半透明パイプラインを通過するシェーダーは、透明度のソートの問題を引き起こす可能性があります。詳細と問題を回避する方法については、3Dレンダリングの制限 - 透明度の並べ替え をお読みください。
半透明なマテリアルは影を落としたり、 hint_screen_texture や hint_depth_texture のUniformに表示したりすることもできません。これにより半透明マテリアルがスクリーン空間の反射や屈折に現れるのを防ぎます。 SDFGI 半透明なマテリアルでは鋭い反射は表示されません (半透明なマテリアルでは粗い反射のみが表示されます)。