Spatial shaders

空间着色器用于为三维对象着色。它们是Godot提供的最复杂的着色器类型。空间着色器是高度可配置的,具有不同的渲染模式和不同的渲染选项(例如:次表面散射、透射、环境遮挡、边缘照明等)。用户可以选择编辑顶点、片段、和光照处理器功能,以影响如何绘制对象。

Render modes

Render mode描述
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_wrapLambert包(取决于粗糙度)用于漫射。
diffuse_oren_nayarOren Nayar弥漫。
diffuse_burleyBurley(迪士尼PBS)弥漫。
diffuse_toon香椿着色为漫反射。
specular_schlick_ggxSchlick-GGX用于镜面反射(默认)。
specular_blinnBlinn for specular(兼容性)。
specular_phongPhong for specular(兼容性)。
specular_toon香椿镜面反射。
specular_disabled禁用镜面反射。
skip_vertex_transformVERTEX/NORMAL/etc. need to be transformed manually in vertex function.
world_vertex_coordsVERTEX/NORMAL/etc. are modified in world coordinates instead of local.
确保正确_法线当对网格应用非均匀尺度时。
vertex_lighting使用基于顶点的照明。
shadows_disabledDisable computing shadows in shader.
ambient_light_disabled禁用环境光和辐射度图的收益。
shadow_to_opacity光照会改变alpha值,阴影部分是不透明的,而没有阴影的地方是透明的。对于AR中将阴影堆叠到一个照相机反馈中很有用。

Built-ins

Values marked as “in” are read-only. Values marked as “out” are for optional writing and will not necessarily contain sensible values. Values marked as “inout” provide a sensible default value, and can optionally be written to. Samplers are not subjects of writing and they are not marked.

Global built-ins

Global built-ins are available everywhere, including custom functions.

内建的描述
in float TIME全球时间,以秒为单位。

Vertex built-ins

Vertex data (VERTEX, NORMAL, TANGENT, BITANGENT) are presented in local model space. If not written to, these values will not be modified and be passed through as they came.

They can optionally be presented in world space by using the world_vertex_coords render mode.

Users can disable the built-in modelview transform (projection will still happen later) and do it manually with the following code:

  1. shader_type spatial;
  2. render_mode skip_vertex_transform;
  3. void vertex() {
  4. VERTEX = (MODELVIEW_MATRIX * vec4(VERTEX, 1.0)).xyz;
  5. NORMAL = (MODELVIEW_MATRIX * vec4(NORMAL, 0.0)).xyz;
  6. // same as above for binormal and tangent, if normal mapping is used
  7. }

Other built-ins, such as UV, UV2 and COLOR, are also passed through to the fragment function if not modified.

用户可以使用内置的“位置”覆盖模型视图矩阵和投影转换。当使用“位置”时,将忽略“顶点”中的值,不会发生投影。然而,传递给片段着色器的值仍然来自于“顶点”。

对于实例化,INSTANCE_CUSTOM变量包含实例自定义数据。 使用粒子时,此信息通常是:

  • ** x**: 以弧度表示的旋转角度。
  • ** y**: 寿命期间的相位(0到1)。
  • ** z**: 动画帧。

This allows you to easily adjust the shader to a particle system using default particles material. When writing a custom particle shader, this value can be used as desired.

内建的描述
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 VERTEXVertex in local coordinates.
out vec4 POSITION如果写入,则覆盖最终顶点位置。
inout vec3 NORMALNormal in local coordinates.
inout vec3 TANGENTTangent in local coordinates.
inout vec3 BINORMALBinormal in local coordinates.
out float ROUGHNESS顶点照明的粗糙度。
inout vec2 UV紫外线主通道。
inout vec2 UV2紫外辅助通道。
in bool OUTPUT_IS_SRGBtrue when calculations happen in sRGB color space (true in GLES2, false in GLES3).
inout vec4 COLOR顶点颜色。
inout float POINT_SIZE点渲染的点大小。
in int INSTANCE_ID实例化的实例ID。
in vec4 INSTANCE_CUSTOM实例自定义数据(主要用于粒子)。

Fragment built-ins

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

内建的描述
in vec2 VIEWPORT_SIZE视区大小(以像素为单位)。
在vec4 FRAGCOORD Coordinate of pixel center in screen space. xy specifies position in window, z specifies fragment depth if DEPTH is not used. Origin is lower-left.
在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_FACINGtrue if current face is front face.
inout vec3 NORMAL来自于顶点函数的法向量(默认情况下,在视图空间中)。
inout vec3 TANGENT来自顶点函数的切线。
inout vec3 BINORMAL来自顶点函数的Binormal。
out vec3 NORMALMAPSet normal here if reading normal from a texture instead of NORMAL.
out float NORMALMAP_DEPTH从变量上方深度。 默认为1.0。
in vec2 UV来自顶点功能的UV。
in vec2 UV2来自顶点功能的UV2。
in bool OUTPUT_IS_SRGBtrue when calculations happen in sRGB color space (true in GLES2, false in GLES3).
in vec4 COLOR来自顶点功能的颜色。
out vec3 ALBEDO反照率(默认为白色)。
out float ALPHAAlpha (0..1); if written to, the material will go to the transparent pipeline.
out float ALPHA_SCISSOR如果写入,则丢弃低于一定量alpha的值。
out float METALLICMetallic (0..1).
out float SPECULARSpecular. Defaults to 0.5, best not to modify unless you want to change IOR.
out float ROUGHNESS粗糙度(0..1)。
out float RIM边缘(0-1区间)。如果使用,Godot计算边缘照明。
out float RIM_TINTRim Tint, goes from 0 (white) to 1 (albedo). If used, Godot calculates rim lighting.
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_COORDPoint Coordinate for drawing points with POINT_SIZE.

内置灯光

编写光处理器功能是完全可选的。您可以通过设置渲染_模式为“无阴影”来跳过光照函数。如果没有写入光照函数,Godot将使用片段函数中写入的材质属性来为您计算光照(取决于渲染_模式)。

To write a light function, assign something to DIFFUSE_LIGHT or SPECULAR_LIGHT. Assigning nothing means no light is processed.

每个像素中的每个光都调用光照函数。在每个光类型的循环中被调用。

下面是一个使用兰伯特光照模型的自定义光函数的例子:

  1. void light() {
  2. DIFFUSE_LIGHT += clamp(dot(NORMAL, LIGHT), 0.0, 1.0) * ATTENUATION * ALBEDO;
  3. }

如果你想把这些光照加在一起,使用“+=”运算符将光线添加到“漫反射_光照”函数中,而不是覆盖它。

警告

The light() function won’t be run if the vertex_lighting render mode is enabled, or if Rendering > Quality > Shading > Force Vertex Shading is enabled in the Project Settings. (It’s enabled by default on mobile platforms.)

内建的描述
in float TIME经过的总时间(秒)。
in vec2 VIEWPORT_SIZE视区大小(以像素为单位)。
在vec4 FRAGCOORD Coordinate of pixel center in screen space. xy specifies position in window, z specifies fragment depth if DEPTH is not used. Origin is lower-left.
在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_SRGBtrue when calculations happen in sRGB color space (true in GLES2, false in GLES3).
in vec3 ALBEDO基地反照率。
in vec3 LIGHT_COLOR光的颜色乘以能量。
out float ALPHAAlpha (0..1); if written to, the material will go to the transparent pipeline.
in float ROUGHNESS粗糙度。
in vec3 TRANSMISSION您的第一个片段函数。
out vec3 DIFFUSE_LIGHT漫射光效果。
out vec3 SPECULAR_LIGHT镜面光效果。