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

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

内建的

描述

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 **

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

在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;
}

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

警告

如果启用了``vertex_lighting``渲染模式,或者在项目设置中启用了**Rendering渲染>Quality质量>Shading着色>强制顶点着色**,则不会运行``light()``函数。(在移动平台上默认启用。)

内建的

描述

in float TIME

经过的总时间(秒)。

in vec2 VIEWPORT_SIZE

视区大小(以像素为单位)。

在vec4 ** FRAGCOORD **

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

在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

您的第一个片段函数。

out vec3 DIFFUSE_LIGHT

漫射光效果。

out vec3 SPECULAR_LIGHT

镜面光效果。