Unity Shader 使用噪声

消融效果、水波效果、全局雾效。

消融效果的实现:

通过噪声纹理采样与设置好的消融属性相减,将算得结果小于0的像素剔除。对于剩下的像素进行正常的光照计算,然后在设定好的宽度范围内对两种溶解颜色进行插值,再将混合得到的颜色与环境光和漫反射光照混合输出。

后面还需要加一个用于处理阴影的Pass,否则已经消融的部分会投射影子。

定义属性:

消融的属性

定义消融需要的Pass:

为了得到正确的光照,我们设置了Pass的LightMode和multi_compile_fwdbase的编译指令。

我们使用Cull off来关闭Shader的面片剔除,来使得其正面和背面都会被渲染。

设置正确的光照模式与渲染队列

定义顶点着色器:

定义顶点着色器

通过片元着色器实现模拟消融效果:

实现片元着色器

  • 首先对噪声纹理进行采样,并将结果和用于控制消融程度的属性相减,传递给clip函数,将结果小于0的像素剔除。
  • 对于剩下的像素,进行正常的光照计算。我们根据漫反射纹理获得反射率albedo,并由此计算环境光照与漫反射光照。
  • 计算烧焦颜色:在宽度为_LineWidth的范围内模拟一个烧焦的颜色变化,使用smoothstep来计算混合系数(当t为1时,表明该像素位于消融的边界处;当t为0时,表明该像素为正常的模型颜色),插值用来模拟一个烧焦效果:使用t来混合两种火焰颜色。同样使用step函数来保证剔除。

自定义投射阴影的Pass:

自定义投射阴影的Pass

同样使用clip函数来剔除片元,然后使用内置宏SHADOW_CASTER_FRAGMENT()来完成阴影投射,将结果输出到深度图和阴影映射纹理中。

水波效果:

全局雾效:

生成噪声:

噪声是怎么生成的https://blog.csdn.net/candycat1992/article/details/50346469

  • 基于晶格的方法(Lattice based)

  • 基于点的方法(Point based)

  • Perlin噪声:

    Perlin噪声还是比较简单的,Perlin噪声的实现需要三个步骤:

    1. 定义一个晶格结构,每个晶格的顶点有一个“伪随机”的梯度向量(其实就是个向量啦)。对于二维的Perlin噪声来说,晶格结构就是一个平面网格,三维的就是一个立方体网格。
    2. 输入一个点(二维的话就是二维坐标,三维就是三维坐标,n维的就是n个坐标),我们找到和它相邻的那些晶格顶点(二维下有4个,三维下有8个,n维下有2n2n个),计算该点到各个晶格顶点的距离向量,再分别与顶点上的梯度向量做点乘,得到2n2n个点乘结果。
    3. 使用缓和曲线(ease curves)来计算它们的权重和。在原始的Perlin噪声实现中,缓和曲线是s(t)=3t2−2t3s(t)=3t2−2t3。