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" 的值提供一个合理的默认值, 并且可以选择写入. 采样器不是写入的对象, 它们没有被标记.
顶点内置¶
顶点数据(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片段函数.
用户可以使用内置的 POSITION
覆盖模型视图矩阵和投影转换。当使用 POSITION
时,将忽略 VERTEX
中的值,不会发生投影。然而,传递给片段着色器的值仍然来自于 VERTEX
。
对于实例化,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 |
金属性(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绘制的点坐标. |
内置灯光¶
编写光处理器功能是完全可选的。您可以通过设置 render_mode 为 unshaded
来跳过光照函数。如果没有写入光照函数,Godot 将使用片段函数中写入的材质属性来为您计算光照(取决于 render_mode)。
要写一个光照函数, 要给 DIFFUSE_LIGHT
或 SPECULAR_LIGHT
指定一些东西. 不指定任何东西意味着不处理光照.
每个像素中的每个光都调用光照函数. 在每个光类型的循环中被调用.
下面是一个使用兰伯特光照模型的自定义光函数的例子:
void light() {
DIFFUSE_LIGHT += clamp(dot(NORMAL, LIGHT), 0.0, 1.0) * ATTENUATION * ALBEDO;
}
如果你想把这些光照加在一起,请使用 +=
运算符将光线添加到 DIFFUSE_LIGHT
函数中,不要覆盖它。
警告
如果启用了 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 |
镜面光效果. |