Shader学习笔记(十)

Shader 高级篇(六)

本节将使用一张噪声纹理来模拟火焰的消融效果,噪声应用在模拟水面的波动上,从而产生波光粼粼的视觉效果。回顾实现的全局雾效,并向其中添加噪声来模拟不均匀的飘渺雾效。

消融效果

消融(dissolve) 效果常见于游戏中的角色死亡、地图烧毁等效果。原理非常简单,概括来说就是噪声纹理+透明度测试。使用对噪声纹理采样的结果和某个控制消融程度的阈值比较,若小于阈值,就使用clip函数把它对应的像素裁剪掉,这些部分就对应了图中被“烧毁”的区域。而镂空区域边缘的烧焦效果则是将两种颜色混合,再用pow函数处理后,与原纹理颜色混合后的结果。

实现

  1. 声明属性
    在这里插入图片描述
  2. 定义顶点和片元着色器
    在这里插入图片描述
  3. 另外声明投射阴影的Pass
    在这里插入图片描述

最终效果

请添加图片描述

水波效果

使用一个由噪声纹理得到的法线贴图,实现一个包含菲耳反射的水面效果。
使用一张立方体纹理(Cubemap)作为环境纹理,模拟反射。为了模拟折射效果,与前面的折射效果实现不同的是,水波的法线纹理是由一张噪声纹理生成而得,而且会随着时间变化不断平移,模拟波光粼粼的效果。除此之外,没有使用一个定值来混合反射和折射颜色,而是使用之前提到的菲涅耳系数来动态决定混合系数。使用如下公式来计算菲涅耳系数:
在这里插入图片描述
实现

  1. 声明属性
    在这里插入图片描述
  2. 定义顶点着色器
    在这里插入图片描述
  3. 定义片元着色器
    在这里插入图片描述

最终效果

请添加图片描述

再谈全局雾效

之前的实现效果是一个基于高度的均匀雾效,即在同一个高度上,雾的浓度是相同的。然而,一些时候希望可以模拟一种不均匀的雾效,同时让雾不断飘动,使雾看起来更加飘渺。而这就可以使用一张噪声纹理来实现。

本节的实现非常简单,只是添加了噪声相关的参数和属性,并在 Shader 的片元着色器中对高度的计算添加了噪声的影响。

  1. 声明脚本FogWithNoiseTest中的参数
    在这里插入图片描述

  2. 实现 OnRenderImage 函数
    在这里插入图片描述
    Shader部分

  3. 声明参数
    在这里插入图片描述

  4. 定义顶点着色器
    在这里插入图片描述

  5. 片元着色器
    在这里插入图片描述

最终效果

请添加图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42050609/article/details/125020813