编辑
2023-11-16
学习
00
请注意,本文编写于 340 天前,最后修改于 339 天前,其中某些信息可能已经过时。

目录

空间着色器(Spatial)
渲染模式
全局内置
顶点内置
片断内置
内置灯光
画布物品着色器 (CanvasItem)
渲染模式
顶点内置
片段内置
内置灯光
SDF函数
粒子着色器(particle)
渲染模式
start 和 process 内置
start专用
Process 专用

在Shader中,有许多内置变量可用,如 UV、COLOR 和 VERTEX。可用的变量取决于着色器的类型(空间、画布项或粒子)以及所使用的函数(vertex、fragment 或 light)。

参考地址:https://docs.godotengine.org/en/4.1/tutorials/shaders/shader_reference/shading_language.html

创建着色器脚本时可以看到有五种着色器类型

image.png

空间着色器(Spatial)

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

内置标记

标记为 "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_skinSubsurface Scattering mode for skin在材质中使用,表示皮肤的亚表面散射模式。
cull_back剔除背面(默认)在材质中使用,表示剔除背面。
cull_front剔除正面在材质中使用,表示剔除正面。
cull_disabled禁用剔除(双面)在材质中使用,表示禁用剔除,渲染双面。
unshaded结果只使用反照率在材质中使用,表示结果只使用反照率,不考虑照明和阴影。
wireframeGeometry 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_transformVERTEX/NORMAL等需要在顶点函数中手动进行转换在材质中使用,表示在顶点函数中手动进行顶点转换。
world_vertex_coordsVERTEX/NORMAL等是以世界坐标而不是局部坐标修改的在材质中使用,表示使用世界坐标而不是局部坐标进行修改。
ensure_correct_normals当对网格应用非均匀尺度时在材质中使用,表示在对网格应用非均匀尺度时确保正确的法线。
shadows_disabled在着色器中禁用阴影计算在材质中使用,表示在着色器中禁用阴影计算。
ambient_light_disabled禁用环境光和辐射度图的收益在材质中使用,表示禁用环境光和辐射度图的收益。
shadow_to_opacity光照会改变alpha值, 阴影部分是不透明的, 而没有阴影的地方是透明的在材质中使用,表示光照会改变alpha值,阴影部分是不透明的,没有

全局内置

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

常数描述
in float TIME全局时间,以秒为单位。
in float PIPI常数(3.141592)。圆周率与直径比例和半圈弧度。
in float TAUTAU常数(6.283185)。等同于PI * 2,表示整圈的弧度。
in float EE常数(2.718281)。欧拉数和自然对数的底。

顶点内置

变量描述用法示例
in vec2 VIEWPORT_SIZE视口大小(单位为像素)。用于获取当前渲染视口的大小。
in mat4 VIEW_MATRIX世界空间向视图空间的转换。用于将顶点从世界空间变换到视图空间。
in mat4 INV_VIEW_MATRIX视图空间向世界空间的转换。用于将顶点从视图空间变换回世界空间。
in mat4 INV_PROJECTION_MATRIX裁剪空间向视图空间的转换。用于将顶点从裁剪空间变换到视图空间。
in vec3 NODE_POSITION_WORLDNode在世界空间的位置。用于获取Node在世界空间中的位置。
in vec3 NODE_POSITION_VIEWNode在视图空间的位置。用于获取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_COORDPOINT_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_WORLDNode位置,世界空间在着色器中使用,表示Node在世界空间中的位置。
in vec3 NODE_POSITION_VIEWNode位置,视图空间在着色器中使用,表示Node在视图空间中的位置。
in vec3 CAMERA_POSITION_WORLDCamera位置,世界空间在着色器中使用,表示摄像机在世界空间中的位置。
in vec3 CAMERA_DIRECTION_WORLDCamera方向,世界空间在着色器中使用,表示摄像机在世界空间中的方向。
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 ALPHAAlpha 值 (0..1)在着色器中使用,表示当前像素的Alpha值。
out float ALPHA_SCISSOR_THRESHOLDAlpha 剪裁阈值在着色器中使用,表示Alpha剪裁的阈值。
out float ALPHA_HASH_SCALEAlpha哈希刻度在着色器中使用,表示Alpha哈希的刻度。
out float ALPHA_ANTIALIASING_EDGEAlpha边缘抗锯齿在着色器中使用,表示Alpha边缘抗锯齿。
out vec2 ALPHA_TEXTURE_COORDINATEAlpha纹理坐标在着色器中使用,表示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_LIGHTSPECULAR_LIGHT 指定一些东西。不指定任何东西意味着不处理光照。

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

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

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

如果你想把这些光照加在一起,请使用 += 运算符将光线添加到 DIFFUSE_LIGHT 函数中,不要覆盖它。

注意

如果启用了 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_COLORColor of light multiplied by energy * PI在着色器中使用,表示经过能量和PI乘法后的光的颜色。
in float SPECULAR_AMOUNT2.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_DIRECTIONALtrue if this pass is a DirectionalLight3D在着色器中使用,表示此通道是否为DirectionalLight3D。
in float ATTENUATION基于距离或阴影的衰减在着色器中使用,表示基于距离或阴影的衰减值。
in vec3 ALBEDO基础反射在着色器中使用,表示基础反射值。
in vec3 BACKLIGHT在着色器中使用,表示背光效果。
in float METALLICMetallic在着色器中使用,表示金属度。
in float ROUGHNESS粗糙度在着色器中使用,表示粗糙度值。
in bool OUTPUT_IS_SRGBtrue when output is in sRGB color space在着色器中使用,表示输出是否在sRGB颜色空间中。
out vec3 DIFFUSE_LIGHT漫射光效果在着色器中使用,表示漫射光效果。
out vec3 SPECULAR_LIGHT镜面反射光效果在着色器中使用,表示镜面反射光效果。
out float ALPHAAlpha (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_transformVERTEX/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. }

与其他着色器类型不同,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)强制从子发射器发射粒子。

本文作者:beiklive

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!