最近看见一个用UE制作的,对效果挺感兴趣于是就用Godot也制作了一个。
Godot的GDShader虽然简单好用,但是由于过度封装照顾新手,想要创建复杂且效果优化都不错的的Shader实则困难。
这个结果包含了水面渲染,水下焦散的低成本(其实不低)解决方案(所以焦散完全不精确),实时反射,基于浅水方程的水面交互,水面交互影响焦散。水面交互能够追踪所有Setup过的物体,能够追踪所有Setup过的碰撞体产生水波反弹,且模拟区域跟着角色移动也不会产生Artifact。
比较深度用过Godot的人应该知道,透明物体的SSR是Godot的一个巨大的问题。在Godot的管线中,透明物体不会写入Depth Buffer,因此不会在它上面渲染SSR。而Godot不支持自定义管线,因此我们无法通过将特定透明物体写入额外深度Pass的方式解决它。所以这个成品实际上还是用了不少相当复杂的Godot技巧来弥补这些问题。
Godot不支持自定义管线,所以上限估计也就距离这个成品不远了。水下体渲染这种事情目前Godot提供的API可能不能那么容易高性能的做出来。总体上距离UE的水体渲染上限差距应该还是不小的。
这个水体(包括水面,焦散,反射,模拟)在我的机器上跑(4070laptop)在1ms以下,性能并没有达到我的理想水平。