[Unity][翻译]云朵Shader步骤分解

如题所述

第1个回答  2022-07-23

人工翻译自Alexandre Stroukoff的文章《CLOUDS SHADER BREAKDOWN》,原文链接: http://astroukoff.blogspot.com/2019/09/clouds-shader-breakdown.html

在正文之前,先说下作者的制作过程,大致分为三步:

从作者的介绍来看,第一步目的是创建云朵模型,第二步目的是烘焙光照,理论上也可以用别的软件来做,并且提前烘焙光照意味着云朵在引擎中是静态不受光照的,这点需要注意,文章末尾也有关于动态光照的说明。

前两步作者只是简单介绍了一下,并且视频很糊,就不贴了,以下是正片,文章中的引用段是我的注释。

我根据ThatGameCompany的游戏《Sky 光遇》制作了一个云朵Shader,本篇文章是关于它的一个小小的步骤分解。

效果中作用最大的是云朵Mesh本身,其次是烘焙光照,我使用Houdini + 3ds Max来生成它们。在这篇文章中我仅注重于介绍Shader部分,Shader使用Amplify Shader Editor(ASE)制作。

第一步连接Vertex Color(顶点色)到Emission(自发光),为了显示先前(在3ds Max中)烘焙的光照,我使用了一个0.454545的指数来校正顶点色(因为sRGB/Linear/Gamma叭啦叭啦)。

大量的三角面能带来更丝滑的移位效果,如果性能上吃得消, Tesselation (曲面细分)是个好办法,在左侧面板勾上“tesselation”选项,选择distance based模式。

调整距离与tesselation参数直到你和你的电脑都满意为止,这里调一个非常近的距离就不错。

现在好玩的来了,我加了一个 Noise Generator(噪声生成器) ,这个节点很方便,它可以根据世界位置生成3D噪声。使用3D噪声比较吃性能,你可以换成Simplex(单形噪声),我很确定整个效果都可以用噪声纹理和UV搞定。我用世界坐标乘以一个浮点数,用作噪声节点的“Size”输入,这个浮点数用来控制噪声的tiling。
并且 从-1/1 映射到 0/1 ,避免出现负值。
在Debug输入中加入了这个(指上面的浮点数)。

现在,不直接使用World Position,而是 将它乘以一个Vector3("NoiseScaleA") ,这样可以 对噪声做非统一缩放 ,非常方便!(就像对Mesh进行缩放一样,但你只是缩放输入位置)。这里我沿Z轴对噪声进行拉伸示范一下效果。

是时候加点移动了,很直接,在我将缩放后的世界坐标连接到噪声之前,我 增加一个Vector3,令时间与它相乘 ,这样就可以控制 噪声移动的方向

现在将它连到 Local Vertex Offset ,并与两个东西相乘:

我决定 把噪声重复3次 。复制所有参数,并且把它们加在一起。这让我想起了以前做过的一个项目(卡通火山碎屑噪声)。思路很简单:对于每个噪声,将力度降低一半,双倍tiling,双倍速度,然后再调整!

每个噪声之间的关系 很重要,这里我只调整Strength(力度),单独调整噪声很容易(将除当前噪声外的所有力度调为0),然后调整力度。

对于渐变的边缘,使用透明材质和 Depth Fade节点 简单设置。

这一部分比较取巧(hack),但它增添了许多细节。大体上来说我就是添加了一个黑白的云朵纹理,并使用Triplanar Mapping(三面映射)采样,为了让Triplanar Mapping动起来,我使用了来自噪声C的修改后的世界位置(看下面的图1),并且我让所有东西与噪声A相乘来“抹去”这里那里的纹理(看下面的图2)。

我使用了Register/Get Local Var节点,避免我的连线乱得像兜里打结的耳机线,ASE的这个功能真是太棒了。

你可以看到加入云朵纹理后的效果,真系好靓!

仓库地址: https://github.com/AlexStrook/UnlitClouds

备注:

相似回答