beiklive's blog beiklive's blog
首页
  • 语言学习

    • C/C++
    • Python
    • Qt
  • 系统&引擎

    • Linux
    • Godot
  • 啥都学

    • 夏姬八学
    • 好好学习
  • 折腾记录

    • 树莓派
    • Obsidian
    • 实践记录
  • 技术文档
  • 工具网站
  • Github项目
  • 友情链接
  • 关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

beiklive

全沾艺人
首页
  • 语言学习

    • C/C++
    • Python
    • Qt
  • 系统&引擎

    • Linux
    • Godot
  • 啥都学

    • 夏姬八学
    • 好好学习
  • 折腾记录

    • 树莓派
    • Obsidian
    • 实践记录
  • 技术文档
  • 工具网站
  • Github项目
  • 友情链接
  • 关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 着色器 - 修改指定位置颜色
  • gdscript 常用代码片段
  • 着色器 - 图片像素化
  • 着色器学习(零) 基础简介
  • 着色器学习(一) 基本语法
  • 着色器学习(二) 内建变量
    • 渲染模式
    • 全局内置
    • 顶点内置
    • 片断内置
    • 内置灯光
    • 渲染模式
    • 顶点内置
    • 片段内置
    • 内置灯光
    • SDF函数
    • 渲染模式
    • start 和 process 内置
    • start专用
    • Process 专用
  • 着色器学习(三) 内建函数
  • 着色器学习(四) 一些内建变量的使用
  • Note_Godot
beiklive
2024-05-15
目录

着色器学习(二) 内建变量

前一篇

04.着色器学习(一)-基本语法

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

:::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;
}
1
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.
}

1
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) 强制从子发射器发射粒子。
编辑 (opens new window)
#godot#着色器
上次更新: 2024/05/22, 14:11:38
着色器学习(一) 基本语法
着色器学习(三) 内建函数

← 着色器学习(一) 基本语法 着色器学习(三) 内建函数→

最近更新
01
爬虫技术与法律风险:个人开发者的注意事项
05-22
02
个人开发者的抉择:个人工作室 vs 公司主体 🤔
05-22
03
《计算机网络,自顶向下方法》笔记(一)
05-20
更多文章>
Theme by Vdoing | Copyright © 2024-2024 beiklive | 苏ICP备20038092号-2
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式