空间明暗器

空间明暗器用于为三维对象着色。它们是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”的值提供了一个合理的默认值,可以选择写入。采样器不是写作主题,也没有标记。

顶点数据 (VERTEXNORMALTANGENTBITANGENT )在局部模型空间中呈现。如果不写入,这些值将不会被修改,并在传入时进行传递。

它们可以通过使用 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

屏幕空间中像素中心的坐标。 xy 指定窗口中的位置, z 指定片段深度如果 DEPTH 未使用。原点在左下方。

在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_LIGHTSPECULAR_LIGHT . 不指定任何内容意味着不处理任何灯光。

对每个像素中的每个灯光都调用灯光函数。它在每种灯光类型的循环中调用。

下面是使用朗伯照明模型的自定义灯光功能示例:

void light() {
    DIFFUSE_LIGHT += dot(NORMAL, LIGHT) * ATTENUATION * ALBEDO;
}

如果要将灯光添加到一起,请将灯光贡献添加到 DIFFUSE_LIGHT 使用 += 而不是重写它。

内置的

描述

在浮动中 TIME

已用总时间(秒)。

在vec2中 VIEWPORT_SIZE

视区大小(像素)。

在vec4中 FRAGCOORD

屏幕空间中像素中心的坐标。 xy 指定窗口中的位置, z 指定片段深度如果 DEPTH 未使用。原点在左下方。

在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

镜面反射光结果。