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:
同样使用clip函数来剔除片元,然后使用内置宏SHADOW_CASTER_FRAGMENT()
来完成阴影投射,将结果输出到深度图和阴影映射纹理中。
水波效果:
全局雾效:
生成噪声:
噪声是怎么生成的:https://blog.csdn.net/candycat1992/article/details/50346469
基于晶格的方法(Lattice based)
基于点的方法(Point based)
Perlin噪声:
Perlin噪声还是比较简单的,Perlin噪声的实现需要三个步骤:
- 定义一个晶格结构,每个晶格的顶点有一个“伪随机”的梯度向量(其实就是个向量啦)。对于二维的Perlin噪声来说,晶格结构就是一个平面网格,三维的就是一个立方体网格。
- 输入一个点(二维的话就是二维坐标,三维就是三维坐标,n维的就是n个坐标),我们找到和它相邻的那些晶格顶点(二维下有4个,三维下有8个,n维下有2n2n个),计算该点到各个晶格顶点的距离向量,再分别与顶点上的梯度向量做点乘,得到2n2n个点乘结果。
- 使用缓和曲线(ease curves)来计算它们的权重和。在原始的Perlin噪声实现中,缓和曲线是s(t)=3t2−2t3s(t)=3t2−2t3。