着色器学习(二) 内建变量
前一篇
在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) | 强制从子发射器发射粒子。 |