水渲染记录

水渲染记录

工作中,经常接到水渲染的需求,项目不同,要求也不同。断断续续几年里,从简单到复杂,也弄了一些,最近索性把市面上做的比较好的一些案例拿到研究了一遍,下面是根据Unity提供的Demo BoatAttack学习后重写的效果,记录一下实现过程。
在这里插入图片描述

海水组成:

水面波: Gerstner Wave

Gerstner Wave是比较简单常用的一种,也能做出挺不错的效果,相关介绍各种大佬也已经说了很多,我这里就直接记录怎么使用
海浪谱公式
在这里插入图片描述
参数解释:Q = 尖锐参数 A = 振幅 D = 波方向 w = 2π/L(L=波长)
将公式写成代码 先在c#中模拟看效果

调整尖锐度对应变化
调整尖锐度的变化
两个叠加
在这里插入图片描述
三个叠加
在这里插入图片描述
四个叠加并调高QA 使得海浪看起来更汹涌
在这里插入图片描述
再加个主浪 全部调整波长
在这里插入图片描述
通过对参数的控制和波的叠加可以模拟出很多环境不同的水面效果,从平静的湖面到汹涌的大海,根据自己的理解写出代码去尝试才会有更深的体会.

计算法线:
法线公式:
在这里插入图片描述
其中:
在这里插入图片描述
将球拉长 将计算出的法线朝向赋值给小球 验证法线结果
在这里插入图片描述
现在 波形和法线都有了!

海水渲染

按照我的片元函数书写顺序罗列篇首效果组成
1.镜反
2.法线
3.菲尼尔
4.高光
5.折射
6.焦散
7.sss
8.白沫

镜反:附加相机RT传入

//_PlaneReflectTex由外部传入
reflection += tex2D(_PlaneReflectTex,fixed2(screenUV.x,(1-screenUV.y)) ).rgb;

在这里插入图片描述
法线: 混合法线扰动

half2 reflectionUV = screenUV + normalWS.zx * half2(0.02, 0.15);
reflection += tex2D(_PlaneReflectTex,fixed2(reflectionUV.x,(1-reflectionUV.y)) ).rgb;

在这里插入图片描述
菲尼尔:

half fresnelTerm = pow(1.0 - saturate(dot(normalWS, viewDirectionWS)), 5);
reflection *= fresnelTerm;

在这里插入图片描述
高光: unity内置DirectBDRF
在这里插入图片描述
高光+阴影
在这里插入图片描述
高光+阴影+镜反+菲尼尔
在这里插入图片描述
折射:

//_CameraOpaqueTexture非透抓屏传入
half3 refraction = tex2D(_CameraOpaqueTexture,distortion).rgb; 

在这里插入图片描述
焦散: 结合深度
在这里插入图片描述
折射+ 焦散
在这里插入图片描述
折射 焦散 深度渐变颜色
在这里插入图片描述
sss:
sss 折射 焦散 深度渐变颜色
在这里插入图片描述
以上叠加
在这里插入图片描述
白沫:
1.算白沫遮罩:根据上面计算的波形法线,波峰 + 海岸线 生成白沫遮罩
2.采样白沫贴图:采样白沫贴图*遮罩
3.白沫光照:主光,环境光,阴影
在这里插入图片描述
最终着色
在这里插入图片描述
在这里插入图片描述

船尾浪花

实时RT 白沫 + 叠加细节波影响尾浪法线
在这里插入图片描述
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值