Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

Spatial 着色器

空间着色器用于为三维对象着色. 它们是Godot提供的最复杂的着色器类型. 空间着色器是高度可配置的, 具有不同的渲染模式和不同的渲染选项(例如: 次表面散射, 透射, 环境遮挡, 边缘照明等). 用户可以选择编辑顶点, 片段, 和光照处理器功能, 以影响如何绘制对象.

渲染模式

渲染模式

描述

blend_mix

混合混合模式(Alpha 为透明度),默认。

blend_add

叠加混合模式。

blend_sub

减法混合模式。

blend_mul

乘法混合模式。

depth_draw_opaque

仅绘制不透明几何体的深度(不透明)。

depth_draw_always

始终绘制深度(不透明和透明)。

depth_draw_never

不绘制深度。

depth_prepass_alpha

对透明几何体进行不透明的深度处理。

depth_test_disabled

禁用深度测试。

sss_mode_skin

Subsurface Scattering(次表面散射)。

cull_back

剔除背面(默认)。

cull_front

剔除正面。

cull_disabled

禁用剔除(双面)。

unshaded

结果只使用反照率。材质中不会发生照明/阴影。

wireframe

Geometry draws using lines.

diffuse_burley

Burley (Disney PBS) for diffuse (default).

diffuse_lambert

Lambert shading for diffuse.

diffuse_lambert_wrap

漫反射使用 Lambert 环绕(受粗糙度影响)。

diffuse_toon

漫反射使用卡通着色。

specular_schlick_ggx

镜面反射使用 Schlick-GGX(默认)。

specular_toon

镜面反射使用 Toon。

specular_disabled

禁用镜面反射。

skip_vertex_transform

VERTEX/NORMAL 等需要在顶点函数中手动进行转换。

world_vertex_coords

VERTEX/NORMAL 等是以世界坐标而不是局部坐标修改的。

ensure_correct_normals

当对网格应用非均匀尺度时。

shadows_disabled

在着色器中禁用阴影计算。

ambient_light_disabled

禁用环境光和辐射度图的收益.

shadow_to_opacity

光照会改变alpha值, 阴影部分是不透明的, 而没有阴影的地方是透明的. 对于AR中将阴影堆叠到一个照相机反馈中很有用.

vertex_lighting

使用基于顶点的照明。

particle_trails

Enables the trails when used on particles geometry.

alpha_to_coverage

core/set.h

alpha_to_coverage_and_one

core/set.h

fog_disabled

Disable receiving depth-based or volumetric fog. Useful for blend_add materials like particles.

内置

标记为 "in" 的值是只读的. 标记为 "out" 的值是可以选择写入的, 不一定包含合理的值. 标记为 "inout" 的值提供一个合理的默认值, 并且可以选择写入. 采样器不是写入的对象, 它们没有被标记.

全局内置

全局内置的功能随处可见, 包括自定义功能.

内置

描述

in float TIME

全球时间, 以秒为单位.

in float PI

A PI constant (3.141592). A ration of circle's circumference to its diameter and amount of radians in half turn.

in float TAU

A TAU constant (6.283185). An equivalent of PI * 2 and amount of radians in full turn.

in float E

A E constant (2.718281). Euler's number and a base of the natural logarithm.

顶点内置

顶点数据(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);
    // same as above for binormal and tangent, if normal mapping is used
}

其他的内置函数, 如UV, UV2和COLOR, 如果没有修改, 也会传递给fragment片段函数.

用户可以使用内置的 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 INV_PROJECTION_MATRIX

裁剪空间向视图空间变换。

in vec3 NODE_POSITION_WORLD

节点在世界空间的位置。

in vec3 NODE_POSITION_VIEW

节点在视图空间的位置。

in vec3 CAMERA_POSITION_WORLD

相机在世界空间的位置。

in vec3 CAMERA_DIRECTION_WORLD

相机在世界空间的方向。

in bool OUTPUT_IS_SRGB

true when output is in sRGB color space (this is true in the Compatibility renderer, false in Forward+ and Forward Mobile).

in int INSTANCE_ID

实例化的实例ID.

in vec4 INSTANCE_CUSTOM

实例自定义数据(主要用于粒子)。

in int VIEW_INDEX

The view that we are rendering. VIEW_MONO_LEFT (0) for Mono (not multiview) or left eye, VIEW_RIGHT (1) for right eye.

in int VIEW_MONO_LEFT

Constant for Mono or left eye, always 0.

in int VIEW_RIGHT

Constant for right eye, always 1.

in vec3 EYE_OFFSET

Position offset for the eye being rendered. Only applicable for multiview rendering.

inout vec3 VERTEX

局部坐标中的顶点.

in int VERTEX_ID

The index of the current vertex in the vertex buffer.

inout vec3 NORMAL

局部坐标法线.

inout vec3 TANGENT

局部坐标切线.

inout vec3 BINORMAL

局部坐标次法线.

out vec4 POSITION

如果写入, 则覆盖最终顶点位置.

inout vec2 UV

UV主通道.

inout vec2 UV2

UV2辅助通道.

inout vec4 COLOR

顶点颜色.

out float ROUGHNESS

顶点照明的粗糙度.

inout float POINT_SIZE

点渲染的点大小.

inout mat4 MODELVIEW_MATRIX

模型空间向视图空间变换(如果可用).

inout mat3 MODELVIEW_NORMAL_MATRIX

inout mat4 MODEL_MATRIX

模型空间到世界空间变换.

inout mat3 MODEL_NORMAL_MATRIX

inout mat4 PROJECTION_MATRIX

视图空间向裁剪空间变换.

inout uvec4 BONE_INDICES

inout vec4 BONE_WEIGHTS

in vec4 CUSTOM0

in vec4 CUSTOM1

in vec4 CUSTOM2

in vec4 CUSTOM3

备注

MODELVIEW_MATRIX combines both the MODEL_MATRIX and VIEW_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 separated MODEL_MATRIX and VIEW_MATRIX.

片段内置

Godot片段处理器函数的默认用法是设置对象的材质属性, 并让内置渲染器处理最终的阴影. 但是, 你无需使用所有这些属性, 如果你不写入它们,Godot将优化掉相应的功能.

内置

描述

in vec2 VIEWPORT_SIZE

视口大小(单位为像素)。

in vec4 FRAGCOORD

屏幕空间中像素中心的坐标. xy 表示窗口位置, 如果不使用 DEPTH, 则 z 表示片段深度. 原点在左下角.

in bool FRONT_FACING

true if current face if front face.

in vec3 VIEW

Normalized vector from fragment position to camera (in view space). This is the same for both perspective and orthogonal cameras.

in vec2 UV

来自顶点功能的UV.

in vec2 UV2

来自顶点功能的UV2.

in vec4 COLOR

来自顶点功能的颜色.

in vec2 POINT_COORD

用POINT_SIZE绘制的点坐标.

in bool OUTPUT_IS_SRGB

true when output is in sRGB color space (this is true in the Compatibility renderer, false in Forward+ and Forward Mobile).

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 vec3 VERTEX

来自顶点函数的顶点(默认情况下, 在视图空间中).

in int VIEW_INDEX

The view that we are rendering. VIEW_MONO_LEFT (0) for Mono (not multiview) or left eye, VIEW_RIGHT (1) for right eye.

in int VIEW_MONO_LEFT

Constant for Mono or left eye, always 0.

in int VIEW_RIGHT

Constant for right eye, always 1.

in vec3 EYE_OFFSET

Position offset for the eye being rendered. Only applicable for multiview rendering.

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

来自顶点函数的切线.<