最终效果展示
天空盒渲染
天空盒没有采用Unity Lighting里内置天空盒的解决方案,使用虚幻引擎导出的天空盒球体模型赋予自定义天空盒材质的解决方案。
由于天空盒球体模型体积过大(scale设置为4000),超出摄像机裁剪空间,Game模式下无法渲染,可以选择直接暴力增大Camera裁剪平面的最远值,但这种方法开销大,不利于优化。
![]()
Camera组件下裁剪平面设置
因此这边通过修改Shader代码,让其z坐标始终在裁剪范围内:
![]()
裁剪空间示意图 不同平台近裁面/远裁面方向不一样,0到w或者w到0,故用判断语句分两种情况
虚幻导出来的这个天空盒球体uv成上下对称的分布,中轴线为0,上下极点为1。因此上了贴图之后还要修改其Tilling和Offset
由于是HDR贴图,需在shader代码里对其进行解码操作(将 HDR 图像从其存储格式转换为一种可以用于渲染的内部格式)
![]()
hdr解码操作 在skybox的shader代码里修改其渲染队列(设置为Background)
水面渲染
水面挂载平面反射脚本:
原理:[Unity/URP学习]平面反射(PlanarReflection)_unity 平面反射-CSDN博客
反射脚本里的模糊算法来自于shader:
(拿来用这个脚本的时候不要忘记导入这个shader)
水面Shader:
叠了两层Normoal,效果会更好一些。第二个Normal是引用第一个的(这样就相当于共用一个normal贴图,对Tilling和Speed上进行一些简单的数值调整就够了)
这段节点让远处法线强度变弱(原理大概就是Object To Clip Pos节点的w分量是顶点到摄像机的距离,w值越大,距离摄像机距离越远,然后用一个除法,相当于距离越远除的数字越大,法线强度就越低,float4这个常量1是确保被除数大于1)
效果前后对比:
![]()
为了营造阳光打在水面上的延伸效果,在ase shader里叠加布林冯光照模型,通过移动场景光源方向模拟阳光效果。
布林冯光照模型节点连接如下:
补充布林冯光照模型知识:在 Blinn-Phong 模型中,使用半程向量(H)和法线(N)之间的夹角进行高光分量的计算,这个半程向量在ase的实现里就是将 World Space Light Direction(世界空间光照方向)和 View Direction(视点方向)相加。
这是Debug下布林冯光照模型应用在案例水面的效果:
解决水天交界处生硬边缘:
算一个遮罩和算好的布林冯模型相乘一下,具体原理没弄懂。
![]()
后处理
不用ase,可以用Custom自定义模式
水底效果
增加水底效果
采样一张水底贴图,并用菲涅尔效果作为因子混合
进一步增加uv扰动和深度感
uv扰动就用前边算出来的WaterNoraml,深度感用Parallax offset这个节点做视差效果(用了这个节点贴图会挤压形变,尚不知道怎么解决)
Blink闪光效果
提高WaterNoise数值,高光处会有Blink闪光效果,但同时整体水面噪声值增加,效果也会跟着改变,这边为了保持其他原本已经调试好的效果,并额外添加Blink效果,选择将WaterNomal和ReflectColor节点暴力复制,简单修改后叠加上去。
ReflectBlink这边通过BlinkThreshold做一个阈值控制,提取出高亮部分,然后通过BlinIntenisty调节强弱。
ReflectBlink部分的Debug效果: