空间明暗器¶
空间明暗器用于为三维对象着色。它们是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 |
禁用剔除(双面)。 |
无阴影 |
结果就是反照率。材质中没有照明/阴影。 |
diffuse_lambert |
漫射的lambert着色(默认)。 |
diffuse_lambert_wrap |
漫反射的兰伯特包裹(粗糙度相关)。 |
diffuse_oren_nayar |
Oren Nayar用于漫反射。 |
diffuse_burley |
百利(迪斯尼PBS)为漫反射。 |
diffuse_toon |
漫射的图恩阴影。 |
specular_schlick_ggx |
Schlick GGX用于镜面反射(默认)。 |
specular_blinn |
用于镜面反射(兼容性)的Blinn。 |
specular_phong |
用于镜面反射(兼容性)的Phong。 |
specular_toon |
用于镜面反射。 |
specular_disabled |
禁用镜面反射。 |
skip_vertex_transform |
顶点/法向/等需要在顶点函数中手动转换。 |
world_vertex_coords |
顶点/法向/等在世界坐标中修改,而不是在局部坐标中修改。 |
ensure_correct_normals |
将不均匀比例应用于网格时使用。 |
vertex_lighting |
使用基于顶点的照明。 |
shadows_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 = (MODELVIEW_MATRIX * vec4(NORMAL, 0.0)).xyz;
// same as above for binormal and tangent, if normal mapping is used
}
如果不进行修改,其他内置组件(如UV、UV2和Color)也会传递给片段函数。
用户可以使用 POSITION
内置。什么时候? POSITION
使用,值来自 VERTEX
被忽略,不会发生投影。但是,传递给片段明暗器的值仍然来自 VERTEX
.
对于实例,实例_自定义变量包含实例自定义数据。使用粒子时,此信息通常是:
x :以弧度表示的旋转角度。
y :生命周期中的阶段(0到1)。
z :动画帧。
这允许您使用默认粒子材质轻松地将明暗器调整到粒子系统。在编写自定义粒子明暗器时,可以根据需要使用此值。
内置的 |
描述 |
---|---|
在浮动中 TIME |
已用总时间(秒)。 |
在vec2中 VIEWPORT_SIZE |
视区大小(像素)。 |
输入输出Mat4 WORLD_MATRIX |
模型空间到世界空间转换。 |
在Mat4中 INV_CAMERA_MATRIX |
世界空间观空间转换。 |
输入输出Mat4 PROJECTION_MATRIX |
视图空间到剪辑空间转换。 |
在Mat4中 CAMERA_MATRIX |
视图空间到世界空间转换。 |
输入输出Mat4 MODELVIEW_MATRIX |
模型空间到视图空间转换(如果可能,请使用)。 |
输入输出Mat4 INV_PROJECTION_MATRIX |
剪辑空间以查看空间转换。 |
输入矢量3 VERTEX |
局部坐标中的顶点。 |
输出vec4 POSITION |
如果写入,将覆盖最终顶点位置。 |
输入矢量3 NORMAL |
在局部坐标中是法向的。 |
输入矢量3 TANGENT |
在局部坐标中相切。 |
输入矢量3 BINORMAL |
局部坐标中的二正态。 |
外浮式 ROUGHNESS |
顶点照明粗糙度。 |
输入矢量2 UV |
紫外线主通道。 |
输入矢量2 UV2 |
紫外线二次通道。 |
在布尔 OUTPUT_IS_SRGB |
当计算发生在sRGB颜色空间中时为真(在gles2中为真,在gles3中为假)。 |
输入矢量4 COLOR |
顶点颜色。 |
输入输出浮动 POINT_SIZE |
点渲染的点大小。 |
INT INSTANCE_ID |
用于实例的实例ID。 |
在vec4中 INSTANCE_CUSTOM |
实例自定义数据(主要用于粒子)。 |
片段内置¶
godot片段处理器函数的默认用法是设置对象的材质属性,并让内置渲染器处理最终着色。但是,您不需要使用所有这些属性,如果您不向它们写入,godot将优化掉相应的功能。
内置的 |
描述 |
---|---|
在浮动中 TIME |
已用总时间(秒)。 |
在vec2中 VIEWPORT_SIZE |
视区大小(像素)。 |
在vec4中 FRAGCOORD |
屏幕空间中像素中心的坐标。 |
在Mat4中 WORLD_MATRIX |
模型空间到世界空间转换。 |
在Mat4中 INV_CAMERA_MATRIX |
世界空间观空间转换。 |
在Mat4中 CAMERA_MATRIX |
视图空间到世界空间转换。 |
在Mat4中 PROJECTION_MATRIX |
视图空间到剪辑空间转换。 |
在Mat4中 INV_PROJECTION_MATRIX |
剪辑空间以查看空间转换。 |
在vec3中 VERTEX |
来自顶点函数的顶点(默认值,在视图空间中)。 |
在vec3中 VIEW |
从相机到片段位置的矢量(在视图空间中)。 |
在布尔 FRONT_FACING |
如果当前面是正面,则为真。 |
输入矢量3 NORMAL |
来自顶点函数的法线(默认值,在视图空间中)。 |
输入矢量3 TANGENT |
来自顶点函数的切线。 |
输入矢量3 BINORMAL |
来自顶点函数的二正态。 |
输出vec3 NORMALMAP |
如果从纹理而不是普通纹理读取正常值,则在此处设置“正常”。 |
外浮式 NORMALMAP_DEPTH |
从变量上方的深度。默认为1.0。 |
在vec2中 UV |
来自顶点函数的UV。 |
在vec2中 UV2 |
来自顶点函数的uv2。 |
在布尔 OUTPUT_IS_SRGB |
当计算发生在sRGB颜色空间中时为真(在gles2中为真,在gles3中为假)。 |
在vec4中 COLOR |
来自顶点函数的颜色。 |
输出vec3 ALBEDO |
反照率(默认为白色)。 |
外浮式 ALPHA |
α(0..1);如果写入,材料将进入透明管道。 |
外浮式 ALPHA_SCISSOR |
如果写入,低于一定数量的alpha值将被丢弃。 |
外浮式 METALLIC |
金属(0..1)。 |
外浮式 SPECULAR |
镜面反射。默认值为0.5,除非要更改IOR,否则最好不要修改。 |
外浮式 ROUGHNESS |
粗糙度(0..1)。 |
外浮式 RIM |
边缘(0..1)。如果使用,Godot计算轮辋照明。 |
外浮式 RIM_TINT |
边缘色调,从0(白色)到1(反照率)。如果使用,Godot计算轮辋照明。 |
外浮式 CLEARCOAT |
小的增加镜面斑点。如果使用,Godot计算透明涂层。 |
外浮式 CLEARCOAT_GLOSS |
透明涂层的光泽。如果使用,Godot计算透明涂层。 |
外浮式 ANISOTROPY |
用于根据切线空间扭曲镜面反射斑点。 |
输出vec2 ANISOTROPY_FLOW |
变形方向,与流程图一起使用。 |
外浮式 SSS_STRENGTH |
次表面散射强度。如果使用,将对物体进行次表面散射。 |
输出vec3 TRANSMISSION |
传输屏蔽(默认为0,0,0)。允许光通过物体。仅在使用时适用。 |
输出vec3 EMISSION |
发射颜色(HDR可以超过1、1、1)。 |
外浮式 AO |
环境光遮挡强度。用于预烘焙AO。 |
外浮式 AO_LIGHT_AFFECT |
AO对灯光的影响程度(0..1;默认值为0)。 |
取样器2d SCREEN_TEXTURE |
内置纹理,可从屏幕上读取。mipmap包含越来越模糊的副本。 |
取样器2d DEPTH_TEXTURE |
内置纹理,用于从屏幕上读取深度。必须使用inv_投影转换为线性。 |
外浮式 DEPTH |
自定义深度值(0..1)。 |
在vec2中 SCREEN_UV |
当前像素的屏幕UV坐标。 |
在vec2中 POINT_COORD |
点大小的绘图点的点坐标。 |
轻型内置¶
写入光处理器功能完全是可选的。通过将“渲染模式”设置为,可以跳过“灯光”功能 unshaded
. 如果没有写入灯光函数,godot将使用片段函数中写入的材质属性为您计算灯光(以渲染模式为准)。
要编写一个光函数,请为 DIFFUSE_LIGHT
或 SPECULAR_LIGHT
. 不指定任何内容意味着不处理任何灯光。
对每个像素中的每个灯光都调用灯光函数。它在每种灯光类型的循环中调用。
下面是使用朗伯照明模型的自定义灯光功能示例:
void light() {
DIFFUSE_LIGHT += dot(NORMAL, LIGHT) * ATTENUATION * ALBEDO;
}
如果要将灯光添加到一起,请将灯光贡献添加到 DIFFUSE_LIGHT
使用 +=
而不是重写它。
内置的 |
描述 |
---|---|
在浮动中 TIME |
已用总时间(秒)。 |
在vec2中 VIEWPORT_SIZE |
视区大小(像素)。 |
在vec4中 FRAGCOORD |
屏幕空间中像素中心的坐标。 |
在Mat4中 WORLD_MATRIX |
模型空间到世界空间转换。 |
在Mat4中 INV_CAMERA_MATRIX |
世界空间观空间转换。 |
在Mat4中 CAMERA_MATRIX |
视图空间到世界空间转换。 |
在Mat4中 PROJECTION_MATRIX |
视图空间到剪辑空间转换。 |
在Mat4中 INV_PROJECTION_MATRIX |
剪辑空间以查看空间转换。 |
在vec3中 NORMAL |
法向量,在视图空间中。 |
在vec2中 UV |
来自顶点函数的UV。 |
在vec2中 UV2 |
来自顶点函数的uv2。 |
在vec3中 VIEW |
视图向量,在视图空间中。 |
在vec3中 LIGHT |
光矢量,在视图空间中。 |
在vec3中 ATTENUATION |
基于距离或阴影的衰减。 |
在布尔 OUTPUT_IS_SRGB |
当计算发生在sRGB颜色空间中时为真(在gles2中为真,在gles3中为假)。 |
在vec3中 ALBEDO |
基底反照率。 |
在vec3中 LIGHT_COLOR |
光的颜色乘以能量。 |
外浮式 ALPHA |
α(0..1);如果写入,材料将进入透明管道。 |
在浮动中 ROUGHNESS |
粗糙度。 |
在vec3中 TRANSMISSION |
片段功能的传输屏蔽。 |
输出vec3 DIFFUSE_LIGHT |
漫射光结果。 |
输出vec3 SPECULAR_LIGHT |
镜面反射光结果。 |