Shader 高级篇(六)
本节将使用一张噪声纹理来模拟火焰的消融效果,噪声应用在模拟水面的波动上,从而产生波光粼粼的视觉效果。回顾实现的全局雾效,并向其中添加噪声来模拟不均匀的飘渺雾效。
消融效果
消融(dissolve) 效果常见于游戏中的角色死亡、地图烧毁等效果。原理非常简单,概括来说就是噪声纹理+透明度测试。使用对噪声纹理采样的结果和某个控制消融程度的阈值比较,若小于阈值,就使用clip函数把它对应的像素裁剪掉,这些部分就对应了图中被“烧毁”的区域。而镂空区域边缘的烧焦效果则是将两种颜色混合,再用pow函数处理后,与原纹理颜色混合后的结果。
实现
- 声明属性
- 定义顶点和片元着色器
- 另外声明投射阴影的Pass
最终效果
水波效果
使用一个由噪声纹理得到的法线贴图,实现一个包含菲耳反射的水面效果。
使用一张立方体纹理(Cubemap)作为环境纹理,模拟反射。为了模拟折射效果,与前面的折射效果实现不同的是,水波的法线纹理是由一张噪声纹理生成而得,而且会随着时间变化不断平移,模拟波光粼粼的效果。除此之外,没有使用一个定值来混合反射和折射颜色,而是使用之前提到的菲涅耳系数来动态决定混合系数。使用如下公式来计算菲涅耳系数:
实现
- 声明属性
- 定义顶点着色器
- 定义片元着色器
最终效果
再谈全局雾效
之前的实现效果是一个基于高度的均匀雾效,即在同一个高度上,雾的浓度是相同的。然而,一些时候希望可以模拟一种不均匀的雾效,同时让雾不断飘动,使雾看起来更加飘渺。而这就可以使用一张噪声纹理来实现。
本节的实现非常简单,只是添加了噪声相关的参数和属性,并在 Shader 的片元着色器中对高度的计算添加了噪声的影响。
-
声明脚本FogWithNoiseTest中的参数
-
实现 OnRenderImage 函数
Shader部分扫描二维码关注公众号,回复: 14214094 查看本文章 -
声明参数
-
定义顶点着色器
-
片元着色器