目录 |
1 使水透明 1.1 水下风光 1.2 透明表面着色器 1.3 移除水阴影 2 水下雾 2.1 找出深度 2.2 抓取背景 2.3 应用雾 2.4 自定义混合 3 伪折射 3.1 抖动背景样本 3.2 使用法线向量 3.3 仅折射水下 3.4 方向性流体 收起 |
水下的雾化和折射(Underwater Fog and Refraction)
文章重点:
让水透明
采样深度并获取渲染的内容
添加水下雾
创建伪折射
这是有关创建流体材质系列文章中的第四篇。我们将使水表面透明,增加水下的雾和折射。
本教程是CatLikeCoding系列的一部分,原文地址见文章底部。“原创”标识意为原创翻译而非原创教程。
本教程使用Unity2017.4.4f1.
(水中折射)
1 使水透明
到目前为止,我们创建的水效果是完全不透明的。这适用于深水或其他非常浑浊的液体,或覆盖有一层碎屑,泡沫,植物或其他阻挡光的液体。但是透明的水是透明的,因此需要透明的着色器。因此,我们将调整表面着色器以使其具有透明度。我们只会关注水下。如果要水下相机的效果,需要不同的方法。
1.1 水下风光
首先,创建一些水下风景,以便在水面下有一些好玩的东西。我创建了一个深坑,其中一些物体暗示了植物的生长,无论深度在地下还是在地面。我还添加了两个漂浮在水面上的球体。为了照亮坑的底部,我添加了一个强烈的聚光灯,该聚光灯从水面射出。此灯和主方向灯都启用了阴影。
(测试场景,还没有水)
我们将使用“扭曲流体”效果,因此将带有该材质的四边形添加到场景中,代表水面。它仍然是完全不透明的,因此它将遮盖所有水下的东西。
(测试场景,不透明的水)
1.2 透明表面着色器
若要使Distortion Flow着色器支持透明性,请将其RenderType标记更改为“Transparent”,并将其“Queue ”标记也设置为“Transparent ”。这使得它可以与你可能拥有的任何替换着色器一起使用,并将着色器移至透明渲染队列,现在已经会所有不透明几何体渲染之后进行绘制。
我们还必须指示Unity从表面着色器代码生成透明着色器,这是通过将alpha关键字添加到表面编译指示中来完成的。
由于我们使用的是基于物理的标准照明功能,因此默认情况下,着色器将使用Unity的透明渲染模式,该模式会将高光和反射保持在其本来透明的表面之上。另一种选择是淡入淡出模式,它会均匀淡出所有内容,这是不真实的。
现在,我们可以通过调整材质albedo的alpha分量来控制水的透明度。
(透明的水表面)
1.3 移除水阴影
即使将其Alpha设置回1,水也不再接收阴影。这是因为现在它已放入透明渲染队列中。由于这些对象的渲染方式,它们无法接收阴影。尽管你可以在某种程度上解决此限制,但是使用简单的表面着色器是不行的。
但是,我们的水仍会投射阴影,从而消除了水下的所有直接照明。我们不希望这样,因为它使水下场景太暗。首先,我们可以删除fillforwardshadows关键字,因为我们不再需要支持任何阴影类型。
这尚未消除主定向光的阴影。这些仍由默认的漫反射阴影投射器过程添加,我们已从漫反射后备着色器继承了该过程。要消除阴影,请删除fallback。
</