写在前面
两年前第一次阅读的时候就没有做什么笔记,阅读效果不太好。而现在回看大串大串的文字会很乏力。有时侯可能只需要看几个高亮关键字就能回想起来整个流程。便想通过博文来记忆各元素,刨析、理解原理,再试图举一反三扩展。如有认为有错误的地方,热烈欢迎指出!
目标效果
- 水不断流动的效果
- 水面波动效果(反射、折射)
- 菲涅尔效应
准备
- 立方体纹理(立方体纹理)作为环境纹理,模拟反射颜色
- GrabPass获取一张当前屏幕的渲染纹理,模拟折射颜色
- 法线纹理(由噪声纹理生成)
- 水面波纹材质纹理(模拟基础颜色)
过程
水不断流动的效果
为了模拟两层交叉的水面效果,用x,y两个偏移速度乘以时间(_Time),来对法线纹理进行采样
反射颜色
采样法线纹理,得到切线空间法线向量。再通过乘以世界坐标下的切线坐标轴向量形成的矩阵,得到世界坐标下的法线向量。
与世界坐标下的视线方向,得到反射向量。用来采样环境纹理,得到反射颜色。
折射颜色
用切线空间下的法线来进行偏移,再乘以屏幕空间下的z(即深度值)来采样渲染纹理。
从而达到模拟深度越大,折射程度越大的效果
菲涅尔效应
点乘法线与视线,pow一下,来得到反射率,用来混合反射颜色与折射颜色得到结果
PS:
schlick菲涅尔公式:
Fschlick(h,v,F0)=F0+(1−F0)(1−(n⋅v))5
n法线方向 v视角方向 h半角向量