着色器学习(二) 内建变量
  前一篇
在Shader中,有许多内置变量可用,如 UV、COLOR 和 VERTEX。可用的变量取决于着色器的类型(空间、画布项或粒子)以及所使用的函数(vertex、fragment 或 light)。
参考地址:https://docs.godotengine.org/en/4.1/tutorials/shaders/shader_reference/shading_language.html
创建着色器脚本时可以看到有五种着色器类型

# 空间着色器(Spatial)
空间着色器用于为三维对象着色. 它们是Godot提供的最复杂的着色器类型. 空间着色器是高度可配置的, 具有不同的渲染模式和不同的渲染选项(例如: 次表面散射, 透射, 环境遮挡, 边缘照明等). 用户可以选择编辑顶点, 片段, 和光照处理器功能, 以影响如何绘制对象.
:::info{title="内置标记"} 标记为 "in" 的值是只读的. 标记为 "out" 的值是可以选择写入的, 不一定包含合理的值. 标记为 "inout" 的值提供一个合理的默认值, 并且可以选择写入. 采样器不是写入的对象, 它们没有被标记. :::
# 渲染模式
| 渲染模式 | 描述 | 用法 | 
|---|---|---|
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 mode for skin | 在材质中使用,表示皮肤的亚表面散射模式。 | 
cull_back |  剔除背面(默认) | 在材质中使用,表示剔除背面。 | 
cull_front |  剔除正面 | 在材质中使用,表示剔除正面。 | 
cull_disabled |  禁用剔除(双面) | 在材质中使用,表示禁用剔除,渲染双面。 | 
unshaded |  结果只使用反照率 | 在材质中使用,表示结果只使用反照率,不考虑照明和阴影。 | 
wireframe |  Geometry draws using lines | 在材质中使用,表示以线框模式绘制几何体。 | 
diffuse_lambert |  漫反射使用 Lambert 着色(默认) | 在材质中使用,表示漫反射使用 Lambert 着色。 | 
diffuse_lambert_wrap |  漫反射使用 Lambert 环绕(受粗糙度影响) | 在材质中使用,表示漫反射使用 Lambert 环绕,受粗糙度影响。 | 
diffuse_burley |  漫反射使用 Burley(迪士尼 PBS) | 在材质中使用,表示漫反射使用 Burley(迪士尼 PBS)。 | 
diffuse_toon |  漫反射使用卡通着色 | 在材质中使用,表示漫反射使用卡通着色。 | 
specular_schlick_ggx |  镜面反射使用 Schlick-GGX(默认) | 在材质中使用,表示镜面反射使用 Schlick-GGX。 | 
specular_blinn |  镜面反射使用 Blinn(兼容) | 在材质中使用,表示镜面反射使用 Blinn。 | 
specular_phong |  镜面反射使用 Phong(兼容) | 在材质中使用,表示镜面反射使用 Phong。 | 
specular_toon |  镜面反射使用 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值, 阴影部分是不透明的, 而没有阴影的地方是透明的 | 在材质中使用,表示光照会改变alpha值,阴影部分是不透明的,没有 | 
# 全局内置
全局内置的功能随处可见, 包括自定义功能.
| 常数 | 描述 | 
|---|---|
in float TIME |  全局时间,以秒为单位。 | 
in float PI |  PI常数(3.141592)。圆周率与直径比例和半圈弧度。 | 
in float TAU |  TAU常数(6.283185)。等同于PI * 2,表示整圈的弧度。 | 
in float E |  E常数(2.718281)。欧拉数和自然对数的底。 | 
# 顶点内置
| 变量 | 描述 | 用法示例 | 
|---|---|---|
in vec2 VIEWPORT_SIZE |  视口大小(单位为像素)。 | 用于获取当前渲染视口的大小。 | 
in mat4 VIEW_MATRIX |  世界空间向视图空间的转换。 | 用于将顶点从世界空间变换到视图空间。 | 
in mat4 INV_VIEW_MATRIX |  视图空间向世界空间的转换。 | 用于将顶点从视图空间变换回世界空间。 | 
in mat4 INV_PROJECTION_MATRIX |  裁剪空间向视图空间的转换。 | 用于将顶点从裁剪空间变换到视图空间。 | 
in vec3 NODE_POSITION_WORLD |  Node在世界空间的位置。 | 用于获取Node在世界空间中的位置。 | 
in vec3 NODE_POSITION_VIEW |  Node在视图空间的位置。 | 用于获取Node在视图空间中的位置。 | 
in vec3 CAMERA_POSITION_WORLD |  相机在世界空间的位置。 | 用于获取相机在世界空间中的位置。 | 
in vec3 CAMERA_DIRECTION_WORLD |  相机在世界空间的方向。 | 用于获取相机在世界空间中的方向。 | 
in bool OUTPUT_IS_SRGB |  当输出在sRGB颜色空间中时为true(在Compatibility渲染器中为true,在Forward+和Forward Mobile中为false)。 | 用于检查当前输出是否在sRGB颜色空间中。 | 
in int INSTANCE_ID |  实例化的实例ID。 | 用于获取当前实例的ID。 | 
in vec4 INSTANCE_CUSTOM |  实例的自定义数据(主要用于粒子)。 | 用于获取实例的自定义数据。 | 
in int VIEW_INDEX |  正在渲染的视图。 VIEW_MONO_LEFT(0)表示单视图或左眼,VIEW_RIGHT(1)表示右眼。 | 用于获取当前渲染的视图索引。 | 
in int VIEW_MONO_LEFT |  单视图或左眼的常量,始终为0。 | 用于比较当前视图是否为单视图或左眼。 | 
in int VIEW_RIGHT |  右眼的常量,始终为1。 | 用于比较当前视图是否为右眼。 | 
in vec3 EYE_OFFSET |  正在渲染的眼睛的位置偏移。仅适用于多视图渲染。 | 用于获取当前渲染眼睛的位置偏移。 | 
inout vec3 VERTEX |  顶点在局部坐标中。 | 用于修改或使用局部坐标中的顶点位置。 | 
in int VERTEX_ID |  顶点缓冲区中当前顶点的索引。 | 用于获取当前顶点在顶点缓冲区中的索引。 | 
inout vec3 NORMAL |  局部坐标法线。 | 用于修改或使用局部坐标中的法线。 | 
inout vec3 TANGENT |  局部坐标切线。 | 用于修改或使用局部坐标中的切线。 | 
inout vec3 BINORMAL |  局部坐标次法线。 | 用于修改或使用局部坐标中的次法线。 | 
out vec4 POSITION |  如果写入,则覆盖最终顶点位置。 | 用于手动设置顶点的最终位置。 | 
inout vec2 UV |  主UV通道。 | 用于修改或使用主UV通道的坐标。 | 
inout vec2 UV2 |  辅助UV通道。 | 用于修改或使用辅助UV通道的坐标。 | 
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 |  自定义数据0。 | 用于获取顶点的自定义数据0。 | 
in vec4 CUSTOM1 |  自定义数据1。 | 用于获取顶点的自定义数据1。 | 
in vec4 CUSTOM2 |  自定义数据2。 | 用于获取顶点的自定义数据2。 | 
in vec4 CUSTOM3 |  自定义数据3。 | 用于获取顶点的自定义数据3。 | 
# 片断内置
Godot片段处理器函数的默认用法是设置对象的材质属性, 并让内置渲染器处理最终的阴影. 但是, 你无需使用所有这些属性, 如果你不写入它们,Godot将优化掉相应的功能.
| 变量名 | 描述 | 用法 | 
|---|---|---|
in vec2 VIEWPORT_SIZE |  视口大小(单位为像素) | 在着色器中使用,表示当前渲染目标的像素大小。 | 
in vec4 FRAGCOORD |  屏幕空间中像素中心的坐标 | 在着色器中使用,表示当前像素的屏幕空间坐标。 | 
in bool FRONT_FACING |  是否为正面面 | 在片段着色器中使用,表示当前片段是否为正面面。 | 
in vec3 VIEW |  从片段位置到摄像机的规范化向量(视图空间) | 在着色器中使用,表示从片段到摄像机的方向。 | 
in vec2 UV |  顶点功能传递的纹理坐标 | 在着色器中使用,表示从顶点功能传递的主纹理坐标。 | 
in vec2 UV2 |  顶点功能传递的第二组纹理坐标 | 在着色器中使用,表示从顶点功能传递的辅助纹理坐标。 | 
in vec4 COLOR |  顶点功能传递的颜色 | 在着色器中使用,表示从顶点功能传递的颜色信息。 | 
in vec2 POINT_COORD |  用 POINT_SIZE 绘制的点坐标 |  在着色器中使用,表示用 POINT_SIZE 绘制的点的坐标。 | 
in bool OUTPUT_IS_SRGB |  输出是否在sRGB颜色空间 | 在着色器中使用,表示当前输出是否在sRGB颜色空间。 | 
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 |  Node位置,世界空间 | 在着色器中使用,表示Node在世界空间中的位置。 | 
in vec3 NODE_POSITION_VIEW |  Node位置,视图空间 | 在着色器中使用,表示Node在视图空间中的位置。 | 
in vec3 CAMERA_POSITION_WORLD |  Camera位置,世界空间 | 在着色器中使用,表示摄像机在世界空间中的位置。 | 
in vec3 CAMERA_DIRECTION_WORLD |  Camera方向,世界空间 | 在着色器中使用,表示摄像机在世界空间中的方向。 | 
in vec3 VERTEX |  顶点,视图空间 (默认情况下) | 在着色器中使用,表示当前顶点的位置。 | 
in int VIEW_INDEX |  渲染的视图索引 | 在着色器中使用,表示当前渲染的视图索引。 | 
in int VIEW_MONO_LEFT |  单眼或左眼的常量,始终为0 | 在着色器中使用,表示单眼或左眼的常量,始终为0。 | 
in int VIEW_RIGHT |  右眼的常量,始终为1 | 在着色器中使用,表示右眼的常量,始终为1。 | 
in vec3 EYE_OFFSET |  渲染的眼睛的位置偏移 | 在着色器中使用,表示当前渲染眼睛的位置偏移。 | 
sampler2D SCREEN_TEXTURE |  在Godot 4中已删除,使用带有hint_screen_texture的sampler2D | 在Godot 3.x中使用,表示屏幕纹理。 | 
in vec2 SCREEN_UV |  当前像素的屏幕UV坐标 | 在着色器中使用,表示当前像素在屏幕上的UV坐标。 | 
sampler2D DEPTH_TEXTURE |  在Godot 4中已删除,使用带有hint_depth_texture的sampler2D | 在Godot 3.x中使用,表示深度纹理。 | 
out float DEPTH |  自定义深度值 (0..1) | 在着色器中使用,表示当前像素的深度值。 | 
inout vec3 NORMAL |  顶点函数中的法线向量 (默认为视图空间) | 在着色器中使用,表示当前顶点的法线向量。 | 
inout vec3 TANGENT |  顶点函数中的切线 | 在着色器中使用,表示当前顶点的切线。 | 
inout vec3 BINORMAL |  顶点函数中的Binormal | 在着色器中使用,表示当前顶点的Binormal。 | 
out vec3 NORMAL_MAP |  从纹理中读取法线而不是NORMAL的法线 | 在着色器中使用,表示从法线纹理中读取的法线。 | 
out float NORMAL_MAP_DEPTH |  法线图的深度值,默认为1.0 | 在着色器中使用,表示法线图的深度值,通常为1.0。 | 
out vec3 ALBEDO |  反射颜色 (默认为白色) | 在着色器中使用,表示当前像素的反射颜色。 | 
out float ALPHA |  Alpha 值 (0..1) | 在着色器中使用,表示当前像素的Alpha值。 | 
out float ALPHA_SCISSOR_THRESHOLD |  Alpha 剪裁阈值 | 在着色器中使用,表示Alpha剪裁的阈值。 | 
out float ALPHA_HASH_SCALE |  Alpha哈希刻度 | 在着色器中使用,表示Alpha哈希的刻度。 | 
out float ALPHA_ANTIALIASING_EDGE |  Alpha边缘抗锯齿 | 在着色器中使用,表示Alpha边缘抗锯齿。 | 
out vec2 ALPHA_TEXTURE_COORDINATE |  Alpha纹理坐标 | 在着色器中使用,表示Alpha纹理的坐标。 | 
out float METALLIC |  金属性(0..1) | 在着色器中使用,表示金属性。 | 
out float SPECULAR |  镜面反射,默认为0.5,最好不要修改 | 在着色器中使用,表示镜面反射,最好不要修改除非你想改变IOR。 | 
out float ROUGHNESS |  粗糙度(0..1) | 在着色器中使用,表示粗糙度。 | 
out float RIM |  边缘(0-1区间),Godot计算边缘照明 | 在着色器中使用,表示边缘,如果使用,Godot将计算边缘照明。 | 
out float RIM_TINT |  边缘色调,从0(白色)到1(反射),Godot计算边缘光照 | 在着色器中使用,表示边缘色调,如果使用,Godot将计算边缘光照。 | 
out float CLEARCOAT |  小幅增加镜面反射斑点,Godot计算清漆涂层 | 在着色器中使用,表示清漆涂层。 | 
out float CLEARCOAT_GLOSS |  清漆涂层的光泽度,Godot计算清漆涂层 | 在着色器中使用,表示清漆涂层的光泽度。 | 
out float ANISOTROPY |  用于根据切线空间扭曲镜面反射斑点 | 在着色器中使用,表示根据切线空间扭曲的镜面反射斑点。 | 
out vec2 ANISOTROPY_FLOW |  失真方向,与流程图一起使用 | 在着色器中使用,表示失真方向,与流程图一起使用。 | 
out float SSS_STRENGTH |  次表面散射强度,如果使用,物体将应用次表面散射 | 在着色器中使用,表示次表面散射强度。 | 
out vec4 SSS_TRANSMITTANCE_COLOR |  次表面散射透射颜色 | 在着色器中使用,表示次表面散射透射颜色。 | 
out float SSS_TRANSMITTANCE_DEPTH |  次表面散射透射深度 | 在着色器中使用,表示次表面散射透射深度。 | 
out float SSS_TRANSMITTANCE_BOOST |  次表面散射透射增强 | 在着色器中使用,表示次表面散射透射增强。 | 
inout vec3 BACKLIGHT |  反光光照 | 在着色器中使用,表示反光光照。 | 
out float AO |  环境遮挡 | 在着色器中使用,表示环境遮挡,通常与预焙环境遮挡一起使用。 | 
out float AO_LIGHT_AFFECT |  环境遮挡对灯光的影响程度,取值在0到1之间, 默认为0 | 在着色器中使用,表示环境遮挡对灯光的影响程度,通常在0到1之间, 默认为0。 | 
out vec3 EMISSION |  发射颜色(HDR可以超过1,1,1) | 在着色器中使用,表示发射颜色,通常用于HDR,可以超过1,1,1。 | 
out vec4 FOG |  如果写入,基于FOG.a,将最终像素颜色与FOG.rgb混合 | 在着色器中使用,表示雾效果,如果写入,基于FOG.a,将最终像素颜色与FOG.rgb混合。 | 
out vec4 RADIANCE |  如果写入,基于RADIANCE.a,将环境贴图辐射与RADIANCE.rgb混合 | 在着色器中使用,表示环境贴图辐射,如果写入,基于RADIANCE.a,将环境贴图辐射与RADIANCE.rgb混合。 | 
out vec4 IRRADIANCE |  如果写入,基于IRRADIANCE.a,将环境贴图辐射与IRRADIANCE.rgb混合 | 在着色器中使用,表示环境贴图辐射,如果写入,基于IRRADIANCE.a,将环境贴图辐射与IRRADIANCE.rgb混合。 | 
# 内置灯光
编写光处理器功能是完全可选的。您可以通过设置 render_mode 为 unshaded 来跳过光照函数。如果没有写入光照函数,Godot 将使用片段函数中写入的材质属性来为您计算光照(取决于 render_mode)。
要写一个光照函数,要给 DIFFUSE_LIGHT 或 SPECULAR_LIGHT 指定一些东西。不指定任何东西意味着不处理光照。
每个像素中的每个光都调用光照函数. 在每个光类型的循环中被调用.
下面是一个使用兰伯特光照模型的自定义光函数的例子:
void light() {
    DIFFUSE_LIGHT += clamp(dot(NORMAL, LIGHT), 0.0, 1.0) * ATTENUATION * ALBEDO;
}
 2
3
如果你想把这些光照加在一起,请使用 += 运算符将光线添加到 DIFFUSE_LIGHT 函数中,不要覆盖它。
:::warning{title="注意"}
如果启用了 vertex_lighting 渲染模式, 或者在项目设置中启用了 Rendering渲染>Quality质量>Shading着色>强制顶点着色 , 则不会运行 light() 函数.(在移动平台上默认启用.)
:::
| 变量名 | 描述 | 用法 | 
|---|---|---|
in vec2 VIEWPORT_SIZE |  视口大小(单位为像素) | 在着色器中使用,表示视口大小,以像素为单位。 | 
in vec4 FRAGCOORD |  屏幕空间中像素中心的坐标 | 在着色器中使用,表示像素中心的屏幕空间坐标,包括窗口位置和深度。 | 
in mat4 MODEL_MATRIX |  模型空间到世界空间变换 | 在着色器中使用,表示模型空间到世界空间的变换矩阵。 | 
in mat4 INV_VIEW_MATRIX |  视图空间向世界空间变换 | 在着色器中使用,表示视图空间向世界空间的逆变换矩阵。 | 
in mat4 VIEW_MATRIX |  世界空间向视图空间转变 | 在着色器中使用,表示世界空间到视图空间的变换矩阵。 | 
in mat4 PROJECTION_MATRIX |  视图空间向裁剪空间变换 | 在着色器中使用,表示视图空间向裁剪空间的变换矩阵。 | 
in mat4 INV_PROJECTION_MATRIX |  裁剪空间向视图空间变换 | 在着色器中使用,表示裁剪空间向视图空间的逆变换矩阵。 | 
in vec3 NORMAL |  法向量,在视图空间中 | 在着色器中使用,表示法向量,通常在视图空间中。 | 
in vec2 UV |  来自顶点功能的UV | 在着色器中使用,表示来自顶点功能的UV坐标。 | 
in vec2 UV2 |  来自顶点功能的UV2 | 在着色器中使用,表示来自顶点功能的UV2坐标。 | 
in vec3 VIEW |  视图向量,在视图空间中 | 在着色器中使用,表示视图向量,通常在视图空间中。 | 
in vec3 LIGHT |  灯光向量,在视图空间中 | 在着色器中使用,表示灯光向量,通常在视图空间中。 | 
in vec3 LIGHT_COLOR |  Color of light multiplied by energy * PI | 在着色器中使用,表示经过能量和PI乘法后的光的颜色。 | 
in float SPECULAR_AMOUNT |  2.0 * light_specular property for OmniLight3D and SpotLight3D. 1.0 for DirectionalLight3D | 在着色器中使用,表示OmniLight3D和SpotLight3D的2.0 * light_specular属性,DirectionalLight3D的值为1.0。 | 
in bool LIGHT_IS_DIRECTIONAL |  true if this pass is a DirectionalLight3D | 在着色器中使用,表示此通道是否为DirectionalLight3D。 | 
in float ATTENUATION |  基于距离或阴影的衰减 | 在着色器中使用,表示基于距离或阴影的衰减值。 | 
in vec3 ALBEDO |  基础反射 | 在着色器中使用,表示基础反射值。 | 
in vec3 BACKLIGHT |  在着色器中使用,表示背光效果。 | |
in float METALLIC |  Metallic | 在着色器中使用,表示金属度。 | 
in float ROUGHNESS |  粗糙度 | 在着色器中使用,表示粗糙度值。 | 
in bool OUTPUT_IS_SRGB |  true when output is in sRGB color space | 在着色器中使用,表示输出是否在sRGB颜色空间中。 | 
out vec3 DIFFUSE_LIGHT |  漫射光效果 | 在着色器中使用,表示漫射光效果。 | 
out vec3 SPECULAR_LIGHT |  镜面反射光效果 | 在着色器中使用,表示镜面反射光效果。 | 
out float ALPHA |  Alpha (0..1);如果写入, 材质将进入透明管道 | 在着色器中使用,表示Alpha通道值,如果写入,材质将进入透明管道。 | 
# 画布物品着色器 (CanvasItem)
画布组件着色器用于绘制Godot中的所有二维元素. 这包括从画布组件继承的所有节点, 以及所有图形用户界面元素.
画布组件着色器比空间着色器包含更少的内置变量和功能, 但它们与顶点, 片段和光处理器功能保持相同的基本结构.
# 渲染模式
| 渲染模式 | 描述 | 用法 | 
|---|---|---|
blend_mix |  混合混合模式(Alpha 为透明度),默认 | 在材质中使用,表示混合混合模式。 | 
blend_add |  叠加混合模式 | 在材质中使用,表示叠加混合模式。 | 
blend_sub |  减法混合模式 | 在材质中使用,表示减法混合模式。 | 
blend_mul |  乘法混合模式 | 在材质中使用,表示乘法混合模式。 | 
blend_premul_alpha |  预乘 Alpha 混合模式 | 在材质中使用,表示预乘 Alpha 混合模式。 | 
blend_disabled |  禁用混合,值(包括 Alpha)会按原样写入 | 在材质中使用,表示禁用混合,值(包括 Alpha)会按原样写入。 | 
unshaded |  结果只使用反照率 | 在材质中使用,表示结果只使用反照率,不考虑照明和阴影。 | 
light_only |  仅在光通过时绘制 | 在材质中使用,表示仅在光通过时绘制。 | 
skip_vertex_transform |  VERTEX/NORMAL/等需要在顶点函数中手动转换 | 在材质中使用,表示在顶点函数中手动进行顶点转换。 | 
# 顶点内置
| 变量 | 描述 | 用法 | 
|---|---|---|
in mat4 MODEL_MATRIX |  局部坐标到世界坐标的转换 | 在着色器中使用,表示局部坐标到世界坐标的转换矩阵。 | 
in mat4 CANVAS_MATRIX |  世界坐标到画布坐标的转换 | 在着色器中使用,表示世界坐标到画布坐标的转换矩阵。 | 
in mat4 SCREEN_MATRIX |  画布坐标到裁剪坐标的转换 | 在着色器中使用,表示画布坐标到裁剪坐标的转换矩阵。 | 
in vec4 INSTANCE_CUSTOM |  实例自定义数据 | 在着色器中使用,表示实例自定义数据。 | 
in bool AT_LIGHT_PASS |  始终为false | 在着色器中使用,表示始终为false。 | 
in vec2 TEXTURE_PIXEL_SIZE |  默认2D纹理的规范化像素大小 | 在着色器中使用,表示默认2D纹理的规范化像素大小。 | 
inout vec2 VERTEX |  图像空间中的顶点 | 在着色器中使用,表示图像空间中的顶点。 | 
inout vec2 UV |  规范化的纹理坐标 | 在着色器中使用,表示规范化的纹理坐标,范围从0到1。 | 
inout vec4 COLOR |  来自顶点原语的颜色 | 在着色器中使用,表示来自顶点原语的颜色。 | 
inout float POINT_SIZE |  点绘图的点大小 | 在着色器中使用,表示点绘图的点大小。 | 
# 片段内置
| 变量 | 描述 | 用法 | 
|---|---|---|
in vec4 FRAGCOORD |  像素中心的坐标 | 在着色器中使用,表示像素中心的坐标。在屏幕空间中,xy 表示窗口中的位置,如果没有用 DEPTH,则 z 表示片段深度。原点位于左下角。 | 
in vec2 SCREEN_PIXEL_SIZE |  单个像素的大小 | 在着色器中使用,表示单个像素的大小。等于分辨率的倒数。 | 
in vec2 POINT_COORD |  所绘制点的坐标 | 在着色器中使用,表示所绘制点的坐标。 | 
sampler2D TEXTURE |  默认的2D纹理 | 在着色器中使用,表示默认的2D纹理。 | 
in vec2 TEXTURE_PIXEL_SIZE |  规范化纹理像素大小 | 在着色器中使用,表示规范化纹理像素大小。对于一个大小为64x32px的Sprite2D纹理,TEXTURE_PIXEL_SIZE = vec2(1/64, 1/32)。 | 
in bool AT_LIGHT_PASS |  始终为false | 在着色器中使用,表示始终为false。 | 
sampler2D SPECULAR_SHININESS_TEXTURE |  对象的镜面反射度纹理 | 在着色器中使用,表示对象的镜面反射度纹理。 | 
in vec4 SPECULAR_SHININESS |  镜面反射度颜色,从纹理中取样 | 在着色器中使用,表示镜面反射度颜色,从纹理中取样。 | 
in vec2 UV |  来自顶点功能的UV | 在着色器中使用,表示来自顶点功能的UV。 | 
in vec2 SCREEN_UV |  屏幕当前像素的UV坐标 | 在着色器中使用,表示屏幕当前像素的UV坐标。 | 
sampler2D SCREEN_TEXTURE |  已在Godot 4中移除。使用带有 hint_screen_texture 的sampler2D | 在着色器中使用,表示已在Godot 4中移除。使用带有 hint_screen_texture 的sampler2D。 | 
inout vec3 NORMAL |  从 NORMAL_TEXTURE 中读取,可写 | 在着色器中使用,表示从 NORMAL_TEXTURE 中读取法线。 | 
sampler2D NORMAL_TEXTURE |  默认2D法线纹理 | 在着色器中使用,表示默认2D法线纹理。 | 
out vec3 NORMAL_MAP |  用于2D中的法线贴图配置,如果使用则覆盖NORMAL | 在着色器中使用,表示用于2D中的法线贴图配置,如果使用则覆盖NORMAL。 | 
out float NORMAL_MAP_DEPTH |  用于法线贴图的深度缩放 | 在着色器中使用,表示用于法线贴图的深度缩放。 | 
inout vec2 VERTEX |  屏幕空间中的像素位置 | 在着色器中使用,表示屏幕空间中的像素位置。 | 
inout vec2 SHADOW_VERTEX |  与VERTEX相同,但可写以更改阴影 | 在着色器中使用,表示与VERTEX相同,但可写以更改阴影。 | 
inout vec3 LIGHT_VERTEX |  与VERTEX相同,但可写以更改照明 | 在着色器中使用,表示与VERTEX相同,但可写以更改照明。 | 
inout vec4 COLOR |  来自顶点函数和输出片段颜色 | 在着色器中使用,表示来自顶点函数和输出片段颜色。 | 
# 内置灯光
| 变量 | 描述 | 用法 | 
|---|---|---|
in vec4 FRAGCOORD |  像素中心的坐标 | 在着色器中使用,表示像素中心的坐标。在屏幕空间中,xy 表示窗口中的位置,如果没有用 DEPTH,则 z 表示片段深度。原点位于左下角。 | 
in vec3 NORMAL |  输入法线 | 在着色器中使用,表示输入法线。 | 
in vec4 COLOR |  输入颜色。这是带有最终调制的片段函数的输出颜色。 | 在着色器中使用,表示输入颜色。这是带有最终调制的片段函数的输出颜色。 | 
in vec2 UV |  来自顶点函数的UV,相当于片段函数中的UV。 | 在着色器中使用,表示来自顶点函数的UV。相当于片段函数中的UV。 | 
sampler2D TEXTURE |  当前CanvasItem使用的纹理。 | 在着色器中使用,表示当前CanvasItem使用的纹理。 | 
in vec2 TEXTURE_PIXEL_SIZE |  默认2D纹理的规范化像素大小。 | 在着色器中使用,表示默认2D纹理的规范化像素大小。对于一个大小为64x32px的Sprite2D纹理,TEXTURE_PIXEL_SIZE = vec2(1/64, 1/32)。 | 
in vec2 SCREEN_UV |  屏幕当前像素的UV坐标。 | 在着色器中使用,表示屏幕当前像素的UV坐标。 | 
in vec2 POINT_COORD |  点精灵的UV坐标。 | 在着色器中使用,表示点精灵的UV坐标。 | 
in vec4 LIGHT_COLOR |  光的颜色。 | 在着色器中使用,表示光的颜色。 | 
in float LIGHT_ENERGY |  光的能量乘数。 | 在着色器中使用,表示光的能量乘数。 | 
in vec3 LIGHT_POSITION |  光的位置,以屏幕空间为单位。如果使用DirectionalLight2D,则始终为vec3(0,0,0)。 | 在着色器中使用,表示光的位置,以屏幕空间为单位。如果使用DirectionalLight2D,则始终为vec3(0,0,0)。 | 
in vec3 LIGHT_DIRECTION |  光的方向,以屏幕空间为单位。 | 在着色器中使用,表示光的方向,以屏幕空间为单位。 | 
in bool LIGHT_IS_DIRECTIONAL |  如果此通道是DirectionalLight2D,则为true。 | 在着色器中使用,表示如果此通道是DirectionalLight2D,则为true。 | 
in vec3 LIGHT_VERTEX |  像素位置,以屏幕空间为单位,如在片段函数中修改。 | 在着色器中使用,表示像素位置,以屏幕空间为单位,如在片段函数中修改。 | 
inout vec4 LIGHT |  从浅色纹理和输出颜色中取值。可修改。如果不使用,将忽略光照函数。 | 在着色器中使用,表示从浅色纹理和输出颜色中取值。可修改。如果不使用,将忽略光照函数。 | 
in vec4 SPECULAR_SHININESS |  物体纹理中设置的镜面反射度。 | 在着色器中使用,表示物体纹理中设置的镜面反射度。 | 
out vec4 SHADOW_MODULATE |  将在此点投射的阴影乘以此颜色。 | 在着色器中使用,表示将在此点投射的阴影乘以此颜色。 | 
# SDF函数
这些函数用于在CanvasItem着色器中对自动生成的Signed Distance Field(SDF)纹理进行采样。SDF纹理是从场景中启用了SDF Collision属性的LightOccluder2D节点生成的。有关更多信息,请参阅2D灯光和阴影文档。
| 函数 | 描述 | 用法 | 
|---|---|---|
float texture_sdf (vec2 sdf_pos) |  执行SDF纹理查找。 | 在CanvasItem着色器的Fragment和Light函数中使用,执行SDF纹理查找。传入SDF纹理坐标,返回相应位置的距离值。 | 
vec2 texture_sdf_normal (vec2 sdf_pos) |  执行SDF法线纹理查找。 | 在CanvasItem着色器的Fragment和Light函数中使用,执行SDF法线纹理查找。传入SDF纹理坐标,返回相应位置的法线值。 | 
vec2 sdf_to_screen_uv (vec2 sdf_pos) |  将SDF坐标转换为屏幕UV坐标。 | 在CanvasItem着色器的Fragment和Light函数中使用,将SDF坐标转换为屏幕UV坐标。传入SDF坐标,返回相应的屏幕UV坐标。 | 
vec2 screen_uv_to_sdf (vec2 uv) |  将屏幕UV坐标转换为SDF坐标。 | 在CanvasItem着色器的Fragment和Light函数中使用,将屏幕UV坐标转换为SDF坐标。传入屏幕UV坐标,返回相应的SDF坐标。 | 
# 粒子着色器(particle)
Particle shaders是一种特殊类型的着色器,在对象被绘制之前运行。它们用于计算材质属性,如颜色、位置和旋转。它们与CanvasItem或Spatial的常规材质一起绘制,具体取决于它们是2D还是3D。
Particle shaders是独特的,因为它们不用于绘制对象本身;它们用于计算粒子属性,然后由CanvasItem或Spatial着色器使用。它们包含两个处理器函数:start() 和 process()。
shader_type particles;
void start() {
	// Place start code here.
}
void process() {
	// Place process code here.
}
 2
3
4
5
6
7
8
9
10
与其他着色器类型不同,particle shaders保留了前一帧输出的数据。因此,particle shaders可用于在多帧上发生的复杂效果。
# 渲染模式
| 渲染模式 | 描述 | 变量的用法 | 
|---|---|---|
| keep_data | 不要在重启时清除以前的数据 | - | 
| disable_force | 禁用引力力 | - | 
| disable_velocity | 忽略 VELOCITY 值 | - | 
# start 和 process 内置
| 变量 | 描述 | 用法 | 
|---|---|---|
| in float LIFETIME | 粒子寿命 | - | 
| in float DELTA | 处理时间差 | - | 
| in uint NUMBER | 发射开始后的唯一编号 | - | 
| in uint INDEX | 粒子索引(在所有粒子范围内) | - | 
| in mat4 EMISSION_TRANSFORM | 发射器变换(用于非本地坐标系) | - | 
| in uint RANDOM_SEED | 随机种子,是随机的基础 | - | 
| inout bool ACTIVE | 当粒子激活时为 true,可以设置为 false。 | 修改粒子的激活状态 | 
| inout vec4 COLOR | 粒子的颜色 | 可以写入 Mesh 的顶点函数中,也可以访问 | 
| inout vec3 VELOCITY | 粒子速度 | 可以修改 | 
| inout mat4 TRANSFORM | 粒子变换 | 可以修改 | 
| inout vec4 CUSTOM | 自定义粒子数据 | 网格的着色器可以使用 INSTANCE_CUSTOM 访问 | 
| inout float MASS | 粒子质量,用于引力场等。默认为 1.0。 | 可以修改 | 
# start专用
| 变量 | 描述 | 用法 | 
|---|---|---|
| in bool RESTART_POSITION | 是否重新开始位置 | - | 
| in bool RESTART_ROT_SCALE | 是否重新开始旋转和缩放 | - | 
| in bool RESTART_VELOCITY | 是否重新开始速度 | - | 
| in bool RESTART_COLOR | 是否重新开始颜色 | - | 
| in bool RESTART_CUSTOM | 是否重新开始自定义数据 | - | 
| in bool RESTART_VELOCITY | 是否重新开始速度 | - | 
# Process 专用
| 变量 | 描述 | 用法 | 
|---|---|---|
| in bool RESTART | 粒子的当前处理帧是否是第一帧。 | - | 
| in uint FLAG_EMIT_POSITION | 在 emit_subparticle 函数的最后一个参数上使用的标志,将位置分配给新粒子的变换。 | - | 
| in uint FLAG_EMIT_ROT_SCALE | 在 emit_subparticle 函数的最后一个参数上使用的标志,将旋转和缩放分配给新粒子的变换。 | - | 
| in uint FLAG_EMIT_VELOCITY | 在 emit_subparticle 函数的最后一个参数上使用的标志,将速度分配给新粒子。 | - | 
| in uint FLAG_EMIT_COLOR | 在 emit_subparticle 函数的最后一个参数上使用的标志,将颜色分配给新粒子。 | - | 
| in uint FLAG_EMIT_CUSTOM | 在 emit_subparticle 函数的最后一个参数上使用的标志,将自定义数据向量分配给新粒子。 | - | 
| in bool COLLIDED | 当粒子与粒子碰撞器发生碰撞时为 true。 | - | 
| in vec3 COLLISION_NORMAL | 上次碰撞的法线。如果未检测到碰撞,则为 vec3(0.0)。 | - | 
| in float COLLISION_DEPTH | 上次碰撞法线的长度。如果未检测到碰撞,则为 0.0。 | - | 
| in vec3 ATTRACTOR_FORCE | 当前粒子上引力子的合力。 | - | 
| in vec4 USERDATAX | 使得可以将补充的用户定义数据集成到粒子处理着色器中。 USERDATAX 是由数字标识的六个内置项,X 可以是介于 1 和 6 之间的数字。 | - | 
| 函数 | 描述 | 
|---|---|
| bool emit_subparticle(mat4 xform, vec3 velocity, vec4 color, vec4 custom, uint flags) | 强制从子发射器发射粒子。 |