Spatial shaders

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

Render modes

Render mode 描述
blend_mix 混合混合模式(alpha是透明度),默认。
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 漫反射的Lambert着色(默认)。
diffuse_lambert_wrap Lambert包(取决于粗糙度)用于漫射。
diffuse_oren_nayar Oren Nayar弥漫。
diffuse_burley Burley(迪士尼PBS)弥漫。
diffuse_toon 香椿着色为漫反射。
specular_schlick_ggx Schlick-GGX用于镜面反射(默认)。
specular_blinn Blinn for specular(兼容性)。
specular_phong Phong for specular(兼容性)。
specular_toon 香椿镜面反射。
specular_disabled 禁用镜面反射。
skip_vertex_transform VERTEX/NORMAL/etc. need to be transformed manually in vertex function.
world_vertex_coords VERTEX/NORMAL/etc. are modified in world coordinates instead of local.
确保_正确_法线 当对网格应用非均匀尺度时。
vertex_lighting 使用基于顶点的照明。
shadows_disabled Disable computing shadows in shader.
ambient_light_disabled 禁用环境光和辐射度图的收益。
shadow_to_opacity 光照会改变alpha值,阴影部分是不透明的,而没有阴影的地方是透明的。对于AR中将阴影堆叠到一个照相机反馈中很有用。

Built-ins

Values marked as "in" are read-only. Values marked as "out" are for optional writing and will not necessarily contain sensible values. Values marked as "inout" provide a sensible default value, and can optionally be written to. Samplers are not subjects of writing and they are not marked.

Global built-ins

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

内建的 描述
in float TIME 全球时间,以秒为单位。

Vertex built-ins

Vertex data (VERTEX, NORMAL, TANGENT, BITANGENT) are presented in local model space. If not written to, these values will not be modified and be passed through as they came.

They can optionally be presented in world space by using the world_vertex_coords render mode.

Users can disable the built-in modelview transform (projection will still happen later) and do it manually with the following code:

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
}

Other built-ins, such as UV, UV2 and COLOR, are also passed through to the fragment function if not modified.

用户可以使用内置的“位置”覆盖模型视图矩阵和投影转换。当使用“位置”时,将忽略“顶点”中的值,不会发生投影。然而,传递给片段着色器的值仍然来自于“顶点”。

对于实例化,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 用于查看空间变换的剪辑空间。
inout vec3 VERTEX Vertex in local coordinates.
out vec4 POSITION 如果写入,则覆盖最终顶点位置。
inout vec3 NORMAL Normal in local coordinates.
inout vec3 TANGENT Tangent in local coordinates.
inout vec3 BINORMAL Binormal in local coordinates.
out float ROUGHNESS 顶点照明的粗糙度。
inout vec2 UV 紫外线主通道。
inout vec2 UV2 紫外辅助通道。
in bool OUTPUT_IS_SRGB true when calculations happen in sRGB color space (true in GLES2, false in GLES3).
inout vec4 COLOR 顶点颜色。
inout float POINT_SIZE 点渲染的点大小。
in int INSTANCE_ID 实例化的实例ID。
in vec4 INSTANCE_CUSTOM 实例自定义数据(主要用于粒子)。

Fragment built-ins

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

内建的 描述
in vec2 VIEWPORT_SIZE 视区大小(以像素为单位)。
在vec4 ** FRAGCOORD ** Coordinate of pixel center in screen space. xy specifies position in window, z specifies fragment depth if DEPTH is not used. Origin is lower-left.
在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 if current face is front face.
inout vec3 NORMAL 来自于顶点函数的法向量(默认情况下,在视图空间中)。
inout vec3 TANGENT 来自顶点函数的切线。
inout vec3 BINORMAL 来自顶点函数的Binormal。
out vec3 NORMALMAP Set normal here if reading normal from a texture instead of NORMAL.
out float NORMALMAP_DEPTH 从变量上方深度。 默认为1.0。
in vec2 UV 来自顶点功能的UV。
in vec2 UV2 来自顶点功能的UV2。
in bool OUTPUT_IS_SRGB true when calculations happen in sRGB color space (true in GLES2, false in GLES3).
in vec4 COLOR 来自顶点功能的颜色。
out vec3 ALBEDO 反照率(默认为白色)。
out float ALPHA Alpha (0..1); if written to, the material will go to the transparent pipeline.
out float ALPHA_SCISSOR 如果写入,则丢弃低于一定量alpha的值。
out float METALLIC Metallic (0..1).
out float SPECULAR Specular. Defaults to 0.5, best not to modify unless you want to change IOR.
out float ROUGHNESS 粗糙度(0..1)。
out float RIM 边缘(0-1区间)。如果使用,Godot计算边缘照明。
out float RIM_TINT Rim Tint, goes from 0 (white) to 1 (albedo). If used, Godot calculates rim lighting.
out float CLEARCOAT 小幅增加镜面团块。如果使用,Godot计算清漆涂层。
out float CLEARCOAT_GLOSS 清漆涂层的光泽度。如果使用,Godot计算清漆涂层。
out float ANISOTROPY 用于根据切线空间扭曲镜面斑点。
out vec2 ANISOTROPY_FLOW 失真方向,与流程图一起使用。
out float SSS_STRENGTH 次表面散射强度。如果使用,物体将应用次表面散射。
out vec3 TRANSMISSION 传输掩码(默认值0,0,0)。允许光穿过物体。只在使用时应用。
out vec3 EMISSION 发射颜色(HDR可以超过1,1,1)。
out float AO 环境遮挡。与预焙环境遮挡一起使用。
out float AO_LIGHT_AFFECT 环境遮挡对灯光的影响程度(取值在0到1之间。默认为0)。
sampler2D SCREEN_TEXTURE 内置纹理,用于从屏幕上读取。 Mipmap包含越来越模糊的副本。
sampler2D DEPTH_TEXTURE 内置纹理,用于从屏幕读取深度。 必须使用INV_PROJECTION转换为线性。
out float DEPTH 自定义深度值(0..1)。
in vec2 SCREEN_UV 屏幕当前像素的UV坐标。
in vec2 POINT_COORD Point Coordinate for drawing points with POINT_SIZE.

内置灯光

编写光处理器功能是完全可选的。您可以通过设置渲染_模式为“无阴影”来跳过光照函数。如果没有写入光照函数,Godot将使用片段函数中写入的材质属性来为您计算光照(取决于渲染_模式)。

To write a light function, assign something to DIFFUSE_LIGHT or SPECULAR_LIGHT. Assigning nothing means no light is processed.

每个像素中的每个光都调用光照函数。在每个光类型的循环中被调用。

下面是一个使用兰伯特光照模型的自定义光函数的例子:

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

如果你想把这些光照加在一起,使用“+=”运算符将光线添加到“漫反射_光照”函数中,而不是覆盖它。

警告

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 视区大小(以像素为单位)。
在vec4 ** FRAGCOORD ** Coordinate of pixel center in screen space. xy specifies position in window, z specifies fragment depth if DEPTH is not used. Origin is lower-left.
在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 true when calculations happen in sRGB color space (true in GLES2, false in GLES3).
in vec3 ALBEDO 基地反照率。
in vec3 LIGHT_COLOR 光的颜色乘以能量。
out float ALPHA Alpha (0..1); if written to, the material will go to the transparent pipeline.
in float ROUGHNESS 粗糙度。
in vec3 TRANSMISSION Transmission mask from fragment function.
out vec3 DIFFUSE_LIGHT 漫射光效果。
out vec3 SPECULAR_LIGHT 镜面光效果。