香雨站

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 115|回复: 1

游戏制作中低成本写实水制作

[复制链接]

1

主题

2

帖子

4

积分

新手上路

Rank: 1

积分
4
发表于 2023-1-9 13:01:44 | 显示全部楼层 |阅读模式
前言

分析需求,在手机和电脑端来说最宝贵的是资源分配问题,而水则是众多在资源中需要分配,且与美术程序痛疼的问题,美术可能最求质量与效果却忽视了性能导致在做shader的时候没有意识去注意draw call分配的问题等,而程序做出来的美术效果可能很不符合美术或者玩家的审美,但可以解决很完美的资源分配的问题
所以这次我将介绍一种比较方便且呈现效果比较好的水制作
效果展示
着色模型在使用 不透明(Opaque) 混合模式时实现透明水面的效果。






我在我自己的个人项目也有用到着一小个技术,大致就是一个平面有水的wave,和能看见水底(水底可以根据自己的喜好调整深浅)占用资源比较少,是个很高效的景观或者路边水塘或者水池水潭等
下面是对应材质的节点与函数


大致思路(核心节点简洁版)


基本就是差不多这样,不算最简但除了水的法线有做两个混合和强弱稍微添加了一点东西外其他都是最简的,水的主要思路就是normal panner 来实现水动,水下的物体要靠另外一个节点来作用叫single layer water material
首先

需要把材质模式(shading model)改成single water


然后在创建一个名为single layer water material的节点


首先来解释一下这个节点的4个接口分别是什么(single layer water material部分)

散射系数(scattering coefficient)
表示光散射(射)到介质(对象也就是水上),介质(水)内发生的光散射量(光射入水中)决定了介质(水中)中物体的颜色和外观(如图1)。在散射量大(光射入水中的量大)的情况下,光会散射得更多,阻止它通过介质。这会导致水看起来更厚或不透明,如橙汁或牛奶。(如图2)(小技巧:因此可以用一个lerp 线性插值做一个(layer)层的遮罩,因此可以达到高性能单片水的效果)
吸收系数(Absorption Coefficients)
吸收系数输入定义了光穿透水量(或参与介质)的深浅程度。每个颜色通道(RGB)或光的波长穿透水的方式不同。当光被它所通过的介质吸收时,光就没了,这意味着它会失去颜色。物体进入具有高吸收系数的介质越远,其颜色消散的可能性就越大。
太阳光阶段(PhaseG)(翻译水平有限翻的不好请指正)
参数控制光线在水中散射的整体前进或后退方向。具体说就是此参数控制散射光相对于太阳方向的各向异性方向性。
水的深度颜色控制或黑白色阶控制(ColorScaleBehindWater)
“水后色阶”输入将乘以水面下方表面的亮度。这种类型的效果在材质中使用,以驱动焦散或阴影的明暗程度。效果如图5所示
其中图1,2,3,4,5阐释了普通深度水如何制作,如何看似与actor有一个深度交互的样子,这是其中一个很简便节省资源的单片面水的制作方式
图1,水下的颜色


图2左边是我画的一个遮罩本质上是一个lerp做的两个颜色的线性插值得出的结果(图3是颜色所示 图4是节点所示)


图3 为什么param2是趋近于黑色的呢?看节点lerp也就是图4中的节点,黑到白本质上就是0-1的意思做了个圆形遮罩而遮罩外就是param2,遮罩内就是param1也就是浅蓝,而这个节点的本质是散射系数理解一下也就知道了


图4


图5 分别是数值为100 50 1 的变化图(其中这个变化只对散射系数趋近于0时有用如图2所示)






创建完成后

就按下图节点连接其中遮罩B的位置可以放置水底中的岩石贴图(如果放置岩石贴图的话需要更改一下操作如图1),
A则是水的颜色lerp混合一下则是控制水底的岩石显示范围,而这个范围则由circle(圆形遮罩)来控制,当然可以根据自己的喜好来变换遮罩的形状,
其中我将在图2解释我是怎么做的,
然后创建一个spheremask,texcoord来控制遮罩大小,
然后吸收系数则连接一个niose来控制部分可以看见水底部分无法看见正如上面的
“首先来解释一下这个节点的4个接口分别是什么”中的图2部分一样,当然你可以自己定义一个可以流动的niose,使用panner节点来做,如何使用可以看我以往的文章“openworld skylight 动态云阴影”里有解释如何做流动的贴图
然后在把太阳光阶段(PhaseG)和水的深度颜色控制或黑白色阶控制(ColorScaleBehindWater)直接创建为变量就好了,不深讲解运用到制作中,但可以根据他的实际定义和本质来进行功能上的创新


图1(就是利用散射系数来做的一个技巧性混合)


小优化的细节

图二中的蓝色的function节点则是由自己制作的材质函数,其目的是可以通过一个四维向量中的三个向量来控制R,G,B,然后通过自创的材质函数(material funtion)来输出mask
这样不仅简洁,而且有效的使用四维向量可以有效的控制”字节“的占用,达到稍微优化的效果
(按F呼出unspecified Funtion或者自行寻找到他,然后寻找到自己创建的一个材质函数)而自定义节点则是如下图第二张展示一样(创建一个material function 其中input连接三个,而output就同样复制三个依次命名)




然后将普通材质面板的部分(制作水面和普通水的材质)

大致思路如下图,通过两个水的法线来混合,使用两个panner来使uv流动
如何使用panner可以看我以往的文章“openworld skylight 动态云阴影”里有解释如何做流动的贴图
创建texcoord来控制贴图采样率(也就是贴图的大小),然后使用BlendAngleCorrectedNormal混合两个法线
我这里没有挨个使用lerp挨个控制单层法线,你们可以使用三个lerp混合两层法线,最后一个lerp如下图一样,意思就是控制总的normal法线的强度,控制法线强度的思路如图1
然后粉色箭头就是给混合后的材质,也就是水底的岩石做一个扰动(来控制水底的折射率),如图2所示
最后普通材质面板就创建高光,折射,普通的颜色,和粗超度,还有透明度(我没有做深化,你们可以在基础上做深化创造)




图一,有一个B通道为1也就是蓝通道为一来控制(线性插值混合)混合后的最终法线意思为,控制0-1的法线


图二




最后材质参数展示

普通深度水(无岩石)










有岩石深度水


小trips

为什么用一个材质函数来做mask的接口功能?因为是节省电脑资源,声明一个vector3的变量,然后mask也应为方便就做了给材质函数去封装,但总的来说就是节省资源和节点的整洁。
如果有对panner节点不懂的或者是想知道panner的其他用法可以看我的其他文章,如下:
“openworld skylight 动态云阴影”里有解释如何做流动的贴图
回复

使用道具 举报

2

主题

8

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2025-4-17 18:18:37 | 显示全部楼层
纯粹路过,没任何兴趣,仅仅是看在老用户份上回复一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|香雨站

GMT+8, 2025-7-2 03:52 , Processed in 0.088947 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.. 技术支持 by 巅峰设计

快速回复 返回顶部 返回列表