通过在空间上的投影,你可以用水来创造一个无限的海洋。波浪是在世界空间中计算出来的,所以你可以把水向各个方向移动。要创造一个无限的海洋,你需要设置相机。运动只发生在X轴和Z轴上。水的高度是恒定的。
对于浮力,你只需要加上"Buoyancy.cs"这个脚本,脚本可以加在任何对象上,浮力基于阿基米德原理,所以你需要选择正确的设置。
脚本参数: Density: 密度-物体的密度。如果你希望你的对象是浮动的,设置一个小于1000的值。例如,木材的密度大约是700。如果值大于1000,则对象将下沉。
Is Concave 是否是凹的 当对象不凸时,需要调整浮点计算
Voxels Limit 一个物体的功率点极限
体素(voxel),是体积元素(volumepixel)的简称,如同像素,体素本身并不含有空间中位置的数据(即它们的坐标),然而却可以从它们相对于其它体素的位置来推敲,意即它们在构成单一张体积影像的数据结构中的位置。
Wave Velocity 波速-沿x轴和z轴的速度矢量倍增器。数值越大,受波驱动的物体越多。同样,脚本与unity physx一起工作。所以你需要添加碰撞器和刚体。否则他们会添加自动。脚本对刚体质量起作用。默认质量为1公斤。
波纹计算在cpu上。(在另一个线程中优化),结果写进纹理里。这允许使用顶点着色器来改变海浪的高度和渲染焦散的波纹。
在无限大海里计算涟漪(波纹)几乎是不可能的。所以计算发生在一个小的区域。在当前演示场景中使用了20米平面的波浪计算。还应该增加20米的碰撞器。
3.1 使用脚本“WaterRipples .cs”来创建动态波纹。
UpdateFPS -波纹计算时间的更新。
Multithreading 多线程-计算主线程或其他线程的波动。建议使用多线程(如果你有超过2个cpu内核),这允许你释放“主线”程计算!
Displacement Resolution:计算波纹纹理的分辨率。越高,细节越好,但负载也越高。将分辨率提高到2倍,负载增加4倍!如果分辨率改变,波的速度也会改变。所以你还需要改变“速度”设置。
Damping : 在使用时间内波动振幅的衰减。
Speed: 速度-波传播的速度。
Use Smoth Waves:平滑尖锐的波浪(比如高斯模糊纹理)
Use Projected Waves:使用投射波;只有当你使用无限的海洋时,你才有必要使用投射波,当网格水移动到相机后面时,波纹相对于世界空间应该是静态的。
注意:如果勾选了“使用投射波(Use Projected Waves)”,你应该使用剪切纹理CutOutTexture!
Cut out Texture剪切纹理:模糊计算区域的边界
WaterRipples .cs脚本里具有公共api方法来处理ripple:
(1)Vector3 GetOffsetByPosition(Vector3 position)
允许你在世界空间获得波浪的位置(带有涟漪)
(2)void CreateRippleByposition(Vector3 position, floa velocity)
允许您在水中创建带有速度的点涟波(正或负)
例如,如果你想通过点击鼠标在水中激起涟漪
public class CreateRipple : MonoBehaviour
{
public WaterRipples waterRipples;
// Update is called once per frame
void Update()
{
if (Input.GetMouseButtonDown(0))
{
var ray = Camera.main.ScreenPointToRay(Input. mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit))
{
Debug.LogError(hit.point);
waterRipples.CreateRippleByPosition(hit.point, 0.3f);
}
}
}
}
3.2 要简单地创建波纹,您可以使用脚本“RippleCreator.cs”。
例如,如果您想给对象创建一个简单的波纹。(一艘船,水中的一根木头,子弹射击,移动的人,等等)只需在你的对象上添加脚本和碰撞器,这会创建一个涟漪。
IsReversedRipple:当你需要翻转前面的涟漪时,使用的反转波纹。(例如从水里跳出来)。
MaxVelocity :最高高度限制。基于物体速度(oldPosition -currectPosition)计算的当前波高。如果物体移动得很快(像摩托艇),波浪会很大。
RandomRipplesInterval随机波动区间:增加随机波纹波动,它允许您添加更多的不均匀性
Reversed Ripple Delay:逆转涟漪延迟,计算反相波之前延迟
SplashEffect :当一个物体与水碰撞飞溅效果
SplashEffectMoved:移动对象的飞溅效果,如果你使用粒子系统,那么粒子的大小会随着速度的变化而变化。
SplashAudioSource:当物体与水碰撞时产生的声音效果
SplashSizeMultiplier:“SplashEffectMoved”粒子的尺寸倍增器
使用“Underwaterposteffec .cs”脚本制作水下效果
注意,脚本使用标准脚本和着色器“sun shaft”,所以,当使用水下效果时,确保你没有删除standart文件夹和编辑器文件夹,包括在水包water pack。
FogColor - 雾色-水下色。
FogDensity 雾密度-水下的颜色密度。
UseSunShafts 使用太阳轴允许添加晒水
SunShaftIntencity:太阳光线的亮度
SunShaftScreenBlendMode:改变混合模式
焦散(表面上的光线折射)是用着色器创建的,所以你可以很容易地调整焦散的大小/亮度/速度/密度和其他参数。它允许您添加现实的结果没有基于真实的波的昂贵的焦散计算。Caustic rendering使用投影仪在表面上绘制。所以如果你想改变面积的大小,你应该改变投射灯的设置。
Tint Color - caustic color 焦散线颜色
Caustic Strength - 焦散线的亮度。此外,亮度也取决于方向的光强度。
Wet strength -湿强度-模拟湿砂。值1不湿。看值为0.8时的不同
Caustic Texture1 and Caustic Texture2:焦散纹理1和焦散纹理2需要生成最终的焦散纹理(第一个纹理用作第二个纹理的uv坐标)
Caustic Distortion Mask:噪声纹理用来模拟焦散失真。Distortion (失真)
FallOff - 焦散的褪色纹理的高度,其中alpha通道为焦散的不透明度。
WetTex- 根据高度对湿表面的淡出纹理。其中rgb是湿表面的颜色,alpha通道是不透明度。
Caustic Direction-移动焦散纹理的方向。x是左/右移动,y是上/下移动。对于第二个焦散纹理,'Z'是左移和'w上/下。
Distortion Direction-仅使用x和y值,其中'x'是左移,' y '是上/下移动,用于失真掩模纹理
Distortion -焦散失真强度
Tint Color - caustic color 焦散线颜色
FallOff - 焦散的褪色纹理的高度,其中alpha通道为焦散的不透明度。
Ripples Strength -波纹强度-波纹焦散的亮度。此外,亮度也取决于方向的光强度。
RampStrength 纹理亮度校正。在二次亮度中,需要根据焦散的距离重新计算线性亮度。焦散看起来更真实。
使用脚本“ReflectionCamera”进行反射
如果你不需要反射,你可以删除脚本(在这种情况下着色器会忽略反射)该脚本创建了一个在水的对面反射的额外摄像机
Texture Scale [0-1]:纹理反射的比例分辨率(例如“1”当前屏幕分辨率,“0.5”一半大小,等等)分辨率越小,计算速度越快,但质量越低。
当相机在地形下时,地形多边形剔除可能是一个问题。您可以应用下面方案修复程序。
解决方案:1)从下载页面下载你Unity 版本的存档“builtin shaders”https://unity3d.com/ru/get-unity/download/archive
2)打开文件夹builtin shaders \ DefaultResourcesExtra \ TerrainShaders \Splats
3)复制着色器到你的项目的任何文件夹,如果你的unity5,复制“Standard-AddPass”,“Standard-Base”,“Standard-FirstPass
4)在你的项目中打开每一个复制的着色器,并在block后面添加线条“Cull Off”
"ReflectionCamera.cs" 将渲染路径设置为正向或延迟。注意,如果你有一个改变地形的第三方插件。改变他的shader。(老版本插件)
水流方向,其中'x'是上/下移动,'y'是左/右移动,z'是波浪动画的速度(波浪纹理1),w'是波浪动画的速度(波浪纹理2)。
泡沫方向,其中'x'是上/下移动,'y'是左/右移动和z'和'w不使用。
菲涅尔反射设置
注意:如果你的“per vertex distortion”设置得太低,相机的边框会被扭曲。不要将值设置得太低。
波浪和水的当前比例设置不依赖于预制比例(网格)。因此,你可以很容易地改变预制规模(网格)或水规模。