Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

雾着色器

雾效着色器用于定义如何在特定区域内向场景中添加(或从中减去)雾气。雾效着色器总是需要与 FogVolumes (雾效体积)以及体积雾配合使用。雾效着色器只有一个处理函数,那就是 fog() 函数。

雾效着色器的分辨率取决于体积雾 Froxel 网格的分辨率。因此,雾效着色器所能呈现的细节程度,取决于 FogVolume (雾效体积)距离摄像机的远近。

雾效着色器是一种特殊的计算着色器,它会在关联的 FogVolume (雾效体积)的轴对齐包围盒(axis-aligned bounding box)所触及的每一个小体素(froxel)上调用一次。这意味着,即便是那些仅仅轻微擦碰到指定 FogVolume 的 Froxel,也依然会被纳入计算。

内置

标记为 in 的值是只读的。标记为 out 的值可以选择性写入,并且它们不一定包含有意义的初始值。采样器(Samplers)不能被写入,因此不做标记。

全局内置变量

全局内置变量在任何地方都可以使用,包括在自定义函数中。

内置

描述

in float TIME

自引擎启动以来的全局时间,以秒为单位。它每经过 3,600 秒就会重置循环一次(这个时长可以通过 rollover 设置来修改)。它受 time_scale (时间缩放/游戏速度)的影响,但不受暂停(pausing)的影响。如果你需要一个不受 time_scale 影响的 TIME 变量,可以添加你自己的 global shader uniform ,并在每一帧更新它。

in float PI

常量 PI (值为 3.141592 )。它是圆的周长与直径的比值,也是转半圈(180度)所包含的弧度数。

in float TAU

常量 TAU (值为 6.283185 )。它等同于 PI * 2 ,也就是一个完整圆周(整圈)所包含的弧度数。

in float E

常量 E (值为 2.718281 )。即欧拉数,自然对数的底数。

Fog 内置

所有雾效体积的输出值都是相互叠加(重叠)的。这样一来,所有的 FogVolumes 就可以一次性全部绘制出来,从而实现高效的渲染。

内置

描述

in vec3 WORLD_POSITION

当前 Froxel 单元格在世界空间中的位置。

in vec3 OBJECT_POSITION

当前 FogVolume (雾效体积)中心点在世界空间中的位置。

in vec3 UVW

三维 UV 坐标,用于将 3D 纹理映射到当前的 FogVolume (雾效体积)上。

in vec3 SIZE

当前 FogVolume 的大小,前提是其 shape (形状)具有尺寸属性。

in vec3 SDF

FogVolume 表面的有向距离场(Signed distance field)。如果在体积内部,数值为负;否则(在体积外部),数值为正。

out vec3 ALBEDO

输出基础颜色值,该值会与光照进行交互,从而生成最终的颜色。只有在应用了雾效体积时,该值才会被写入。

out float DENSITY

输出密度值。该值可以是负数,这样就能实现从一个体积中减去另一个体积的效果。雾效着色器必须使用密度值,否则它不会渲染出任何效果。

out vec3 EMISSION

输出自发光颜色值。该值会在光照计算阶段叠加到颜色上,从而生成最终的颜色。只有在使用雾效体积(fog volume)时,该值才会被写入。