Spatial 着色器
空间着色器用于为三维对象着色. 它们是Godot提供的最复杂的着色器类型. 空间着色器是高度可配置的, 具有不同的渲染模式和不同的渲染选项(例如: 次表面散射, 透射, 环境遮挡, 边缘照明等). 用户可以选择编辑顶点, 片段, 和光照处理器功能, 以影响如何绘制对象.
渲染模式
渲染模式 | 描述 |
---|---|
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 | 漫反射的Toon卡通着色。 |
specular_schlick_ggx | Schlick-GGX用于镜面反射(默认). |
specular_blinn | Blinn for specular(兼容性). |
specular_phong | Phong for specular(兼容性). |
specular_toon | 镜面的Toon卡通着色。 |
specular_disabled | 禁用镜面反射. |
skip_vertex_transform | VERTEX/NORMAL/等. 需要在顶点函数中手动进行转换. |
world_vertex_coords | VERTEX/NORMAL/等. 是以世界坐标而不是局部坐标修改的. |
ensure_correct_normals | 当对网格应用非均匀尺度时. |
vertex_lighting | 使用基于顶点的照明. |
specular_disabled | 在着色器中禁用阴影计算. |
ambient_light_disabled | 禁用环境光和辐射度图的收益. |
shadow_to_opacity | 光照会改变alpha值, 阴影部分是不透明的, 而没有阴影的地方是透明的. 对于AR中将阴影堆叠到一个照相机反馈中很有用. |
内置
标记为 “in” 的值是只读的. 标记为 “out” 的值是可以选择写入的, 不一定包含合理的值. 标记为 “inout” 的值提供一个合理的默认值, 并且可以选择写入. 采样器不是写入的对象, 它们没有被标记.
全局内置
全局内置的功能随处可见, 包括自定义功能.
内置 | 描述 |
---|---|
in float TIME | 全球时间, 以秒为单位. |
顶点内置
顶点数据(VERTEX
, NORMAL
, TANGENT
, BITANGENT
) 是在本地模型空间中呈现. 如果不写入, 这些值将不会被修改, 并按其原来的样子传递.
通过使用 world_vertex_coords 渲染模式, 它们可以选择性地在世界空间中呈现.
用户可以禁用内置的modelview变换(以后仍会发生投影), 并通过以下代码手动完成:
shader_type spatial;
render_mode skip_vertex_transform;
void vertex() {
VERTEX = (MODELVIEW_MATRIX * vec4(VERTEX, 1.0)).xyz;
NORMAL = normalize((MODELVIEW_MATRIX * vec4(NORMAL, 0.0)).xyz);
// same as above for binormal and tangent, if normal mapping is used
}
其他的内置函数, 如UV, UV2和COLOR, 如果没有修改, 也会传递给fragment片段函数.
用户可以使用内置的 “位置” 覆盖模型视图矩阵和投影转换. 当使用 “位置” 时, 将忽略 “顶点” 中的值, 不会发生投影. 然而, 传递给片段着色器的值仍然来自于 “顶点”.
对于实例化,INSTANCE_CUSTOM变量包含实例自定义数据. 使用粒子时, 此信息通常是:
x:旋转角度,单位为弧度。
y:生命周期的阶段(0 到 1)。
z:动画帧。
这允许你轻松地将着色器调整为使用默认粒子材质的粒子系统. 在编写自定义粒子着色器时, 可以根据需要使用这个值.
内置 | 描述 |
---|---|
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 | 局部坐标中的顶点. |
out vec4 POSITION | 如果写入, 则覆盖最终顶点位置. |
inout vec3 NORMAL | 局部坐标法线. |
inout vec3 TANGENT | 局部坐标切线. |
inout vec3 BINORMAL | 局部坐标次法线. |
out float ROUGHNESS | 顶点照明的粗糙度. |
inout vec2 UV | UV主通道. |
inout vec2 UV2 | UV2辅助通道. |
in bool OUTPUT_IS_SRGB | 当计算发生在sRGB色彩空间时为 |
inout vec4 COLOR | 顶点颜色. |
inout float POINT_SIZE | 点渲染的点大小. |
in int INSTANCE_ID | 实例化的实例ID. |
in vec4 INSTANCE_CUSTOM | 实例自定义数据(主要用于粒子). |
片段内置
Godot片段处理器函数的默认用法是设置对象的材质属性, 并让内置渲染器处理最终的阴影. 但是, 你无需使用所有这些属性, 如果你不写入它们,Godot将优化掉相应的功能.
内置 | 描述 |
---|---|
in vec2 VIEWPORT_SIZE | 视区大小(以像素为单位). |
in vec4 FRAGCOORD | 屏幕空间中像素中心的坐标. |
in 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 |
|
inout vec3 NORMAL | 来自于顶点函数的法向量(默认情况下, 在视图空间中). |
inout vec3 TANGENT | 来自顶点函数的切线. |
inout vec3 BINORMAL | 来自顶点函数的Binormal. |
out vec3 NORMALMAP | 如果从纹理中读取法线而不是NORMAL, 在这里设置normal. |
out float NORMALMAP_DEPTH | 从变量上方深度. 默认为1.0. |
in vec2 UV | 来自顶点功能的UV. |
in vec2 UV2 | 来自顶点功能的UV2. |
in bool OUTPUT_IS_SRGB | 当计算发生在sRGB色彩空间时为 |
in vec4 COLOR | 来自顶点功能的颜色. |
out vec3 ALBEDO | 反射(默认为白色). |
out float ALPHA | Alpha (0..1);如果写入, 材质将进入透明管道. |
out float ALPHA_SCISSOR | 如果写入, 则丢弃低于一定量alpha的值. |
out float METALLIC | Metallic (0..1). |
out float SPECULAR | 镜面. 默认为0.5, 最好不要修改, 除非你想改变IOR. |
out float ROUGHNESS | 粗糙度(0..1). |
out float RIM | 边缘(0-1区间). 如果使用,Godot计算边缘照明. |
out float RIM_TINT | 边缘色调, 从0(白色)到1(反射). 如果使用,Godot会计算边缘光照. |
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_SIZE绘制的点坐标. |
内置灯光
编写光处理器功能是完全可选的. 您可以通过设置渲染_模式为 “无阴影” 来跳过光照函数. 如果没有写入光照函数,Godot将使用片段函数中写入的材质属性来为您计算光照(取决于渲染_模式).
要写一个光照函数, 要给 DIFFUSE_LIGHT
或 SPECULAR_LIGHT
指定一些东西. 不指定任何东西意味着不处理光照.
每个像素中的每个光都调用光照函数. 在每个光类型的循环中被调用.
下面是一个使用兰伯特光照模型的自定义光函数的例子:
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 | 视区大小(以像素为单位). |
in vec4 FRAGCOORD | 屏幕空间中像素中心的坐标. |
in 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 | 当计算发生在sRGB色彩空间时为 |
in vec3 ALBEDO | 基础反射. |
in vec3 LIGHT_COLOR | 光的颜色乘以能量. |
out float ALPHA | Alpha (0..1);如果写入, 材质将进入透明管道. |
in float ROUGHNESS | 粗糙度. |
in vec3 TRANSMISSION | 您的第一个片段函数. |
out vec3 DIFFUSE_LIGHT | 漫射光效果. |
out vec3 SPECULAR_LIGHT | 镜面光效果. |