Spatial着色器
空间着色器用于为三维对象着色.它们是Godot提供的最复杂的着色器类型.空间着色器是高度可配置的,具有不同的渲染模式和不同的渲染选项(例如:次表面散射、透射、环境遮挡、边缘照明等).用户可以选择编辑顶点、片段、和光照处理器功能,以影响如何绘制对象.
渲染模式
渲染模式 | 描述 |
---|---|
blendmix | 混合混合模式(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 | 香椿着色为漫反射. |
specular_schlick_ggx | Schlick-GGX用于镜面反射(默认). |
specular_blinn | Blinn for specular(兼容性). |
specular_phong | Phong for specular(兼容性). |
specular_toon | 香椿镜面反射. |
specular_disabled | 禁用镜面反射. |
skip_vertex_transform | VERTEX/NORMAL/等.需要在顶点函数中手动进行转换. |
world_vertex_coords | VERTEX/NORMAL/等.是以世界坐标而不是局部坐标修改的. |
确保正确_法线 | 当对网格应用非均匀尺度时. |
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 | 视区大小(以像素为单位). |
输入输出mat4 WORLD_MATRIX | 模型空间到世界空间变换. |
in mat4 INV_CAMERA_MATRIX | 观看空间变换的世界空间. |
输入输出mat4 PROJECTION_MATRIX | 查看空间以剪切空间变换. |
in mat4 CAMERA_MATRIX | 查看空间到世界空间变换. |
输入输出mat4 MODELVIEW_MATRIX | 用于查看空间变换的模型空间(如果可能,请使用). |
输入输出mat4 INV_PROJECTION_MATRIX | 用于查看空间变换的剪辑空间. |
输入输出vec3 VERTEX | 局部坐标中的顶点. |
输出vec4 POSITION | 如果写入,则覆盖最终顶点位置. |
输入输出vec3 NORMAL | 局部坐标法线. |
输入输出vec3 TANGENT | 局部坐标切线. |
输入输出vec3 BINORMAL | 局部坐标次法线. |
out float ROUGHNESS | 顶点照明的粗糙度. |
输入输出vec2 UV | 紫外线主通道. |
输入输出vec2 UV2 | 紫外辅助通道. |
输入bool OUTPUT_IS_SRGB | 当计算发生在sRGB色彩空间时为 |
输入输出vec4 COLOR | 顶点颜色. |
输入输出float POINT_SIZE | 点渲染的点大小. |
in int INSTANCE_ID | 实例化的实例ID. |
in vec4 INSTANCE_CUSTOM | 实例自定义数据(主要用于粒子). |
片段内置
Godot片段处理器函数的默认用法是设置对象的材质属性,并让内置渲染器处理最终的阴影.但是,你无需使用所有这些属性,如果你不写入它们,Godot将优化掉相应的功能.
内置 | 描述 |
---|---|
in vec2 VIEWPORT_SIZE | 视区大小(以像素为单位). |
在vec4 FRAGCOORD | 屏幕空间中像素中心的坐标. |
在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 |
|
输入输出vec3 NORMAL | 来自于顶点函数的法向量(默认情况下,在视图空间中). |
输入输出vec3 TANGENT | 来自顶点函数的切线. |
输入输出vec3 BINORMAL | 来自顶点函数的Binormal. |
out vec3 NORMALMAP | 如果从纹理中读取法线而不是NORMAL,在这里设置normal. |
out float NORMALMAP_DEPTH | 从变量上方深度. 默认为1.0. |
in vec2 UV | 来自顶点功能的UV. |
in vec2 UV2 | 来自顶点功能的UV2. |
输入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 | 视区大小(以像素为单位). |
在vec4 FRAGCOORD | 屏幕空间中像素中心的坐标. |
在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 | 基于距离或阴影的衰减. |
输入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 | 镜面光效果. |