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

香椿着色为漫反射.

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色彩空间时为 true (GLES2为 true ,GLES3为 false ).

输入输出vec4 COLOR

顶点颜色.

输入输出float POINT_SIZE

点渲染的点大小.

in int INSTANCE_ID

实例化的实例ID.

in vec4 INSTANCE_CUSTOM

实例自定义数据(主要用于粒子).

片段内置

Godot片段处理器函数的默认用法是设置对象的材质属性,并让内置渲染器处理最终的阴影.但是,你无需使用所有这些属性,如果你不写入它们,Godot将优化掉相应的功能.

内置

描述

in vec2 VIEWPORT_SIZE

视区大小(以像素为单位).

在vec4 ** FRAGCOORD **

屏幕空间中像素中心的坐标.``xy``表示窗口位置,如果不使用``DEPTH``,则``z``表示片段深度.原点在左下角.

在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

true ,如果当前面是正面.

输入输出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色彩空间时为 true (GLES2为 true ,GLES3为 false ).

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_LIGHTSPECULAR_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 **

屏幕空间中像素中心的坐标.``xy``表示窗口位置,如果不使用``DEPTH``,则``z``表示片段深度.原点在左下角.

在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色彩空间时为 true (GLES2为 true ,GLES3为 false ).

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

镜面光效果.