Unity中“交互水”的制作流程

本文详细介绍了在Unity中制作交互水效果的流程,包括叠加法线纹理动画模拟水流,利用法线和屏幕深度实现折射,通过顶点偏移创建水浪,以及使用深度图和场景深度制作水岸交互遮罩。同时,文中还提到了代码实现细节,如法线纹理混合、折射算法和水岸交互的顶点动画。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

交互水效果详解

使用着色器制作水的技术五花八门,为了达到各种效果的制作技巧和手段也非常多。这里介绍一种普遍常用的制作水的流程,效果包括反射,折射,波浪起伏,水岸交互等。
在这里插入图片描述

实现原理:

1.叠加不同方向和强度的法线纹理动画来模拟水流。
2.利用法线纹理反映射后的值偏移抓屏纹理(RenderTexture)的UV,模拟水的折射效果。
3.利用顶点偏移模拟水浪。
4.使用深度图和场景深度(屏幕深度)的差值来模拟得到物体和水相交处的遮罩。
5.本案例的ASE版用的Specular的PBR模板,所以用Smoothness和Specular来模拟高光和粗糙度。而代码版用的是自定义灯光,所以是做的Bulinn-Phong高光计算。
**

算法实现:

1.法线纹理动画叠加
这里只叠了2层法线,如果追求效果可多叠几层。
在这里插入图片描述
在这里插入图片描述此节点为Texture Object类型,可以生成贴图实例。
BlendNormals节点作用是混合两张法线贴图,
公式:BlendNormal = normalize( float3( A.xy + B.xy, A.z*B.z ).
这里内部已经将法向量从切线空间变换到了世界空间。

代码中进行了切线空间转世界空间的变换,但是法线叠加算法直接用的加法并归一化,和ASE中的法线混合算法BlendNormal不同,效果其实差不多:

/**************计算法线纹理UV偏移,并将法线纹理反映射,得到切线空间下的法向量,最终将法向量转换到世界空间下**************/
float2 bumpUVOffset0 = i.uv.xy + _Time.y * _Speed0; //其中一个方向的法线UV偏移
float2 bumpUVOffset1 = i.uv.xy + _Time.y * _Speed1; //另一个方向的法线UV偏移
float3 bump0 = UnpackNormal(tex2D(_NormalMap, bumpUVOffset0)); //将一个方向的法线反映射
float3 bump1 = UnpackNormal(tex2D
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值