其实好像不算是个 100% 的程式主题。
毕竟是 Shader 所以应该算技美=50% 程式+50% 美术?
今年初在完成游戏 AI 的翻新后,决定放自己一长段时间的假暂时不要想现在游戏专案的
开发。于是二月、三月、四月期间我做了一系列无关手上专案的游戏实验。
三月的时候我研究起了能怎样在短时间内建构一个能被有效使用的世界,不过当时日本政
府国土交通省正巧公布了一个全国都市建模计画,可以说是与上面研究的部分内容重叠甚
至让上面的研究变得不必要。
于是我一边有点悻悻然地整理成果写起了工作流程研究文章,一边构思接下来该研究什么
才好。于是四月时就将研究转移到奠基于前述既有建模,能怎样拿来利用的部分。
一、完整的东京 23 区建模
Plateau 计画是一个要将全日本都市都进行建模的土木计画。
这个大前提代表了几件事情:
-土木用途为重,例如说疏洪防灾的模拟计算,资料完全不是为了游戏而准备的
-也毕竟是土木用途为重,建模品质并无一致
--大约只有一成以下的建模是 LOD 2 级(形状完全正确,附加低分辨率材质)
--其余则是 LOD 1 级(只有外框形状正确)
也因此说是与前述工作流程部分重叠而已,因为要根据这样的资料做成能用的场景还是需
要进行相当的额外处理。
截止到现在为止,全国的建模都已经被公布了,而今年三月公布这个计画的初期成果是东
京 23 区的完整建模。那一成的精细建模还附赠超大的材质,而就算用上了几 GB 的材质
,实际上也只是低分辨率的平面贴图,近看完全不行。
因而让我想研究能怎样以此为基础延伸。
但也先说现阶段我完全不建议任何人尝试以 Plateau 的建模资料去制作游戏。光是要放
进去 Unity 正常执行就很折腾了 XD
倒是熟悉 Unreal 的人或许可以试试看 UE5 的 Nanite 对于自动处理这些资料的效果有多
好。在我初步的尝试中感觉是还不错,如果未来要延伸 Plateau 建模应用的话,我应该会
拿来当作借口摸 UE5。
二、纯 Shader 的无材质表现
去年底的时候因为 Digital Foundry 的介绍让我注意到了《空战猎鹰(Falconeer)》这
款游戏,这款游戏只使用了 Shader,甚至所有的 UI 都是用 Shader 写出来的成果而没
有使用到任何材质。唯一的例外是因为主机效能问题生成海洋的噪声有事先生成出来的材
质。
虽然游戏性本身并不是我特别喜欢的部分,但是视觉表现的部分却相当惊人,也因为是
纯 Shader 表现的而能以一人之姿完成这款开放世界游戏。在追踪了解的访问中可以了解
到一些这个实作能带来的性质与好处:
(一)游戏里面所有光线表现都独立于 Unity 本身的光线渲染
也就是 Unlit(不受光),因此可以很有目的性地表现出理想的视觉。
(二)由于完全不使用材质,所以整个游戏的内存需求极小
小到他可以一次性加载整个开放世界不用进行效能管理。
(三)大部分的 Shader 表现具备自动化的性质
像是根据在世界中的高度决定雪、草的密度,因此他可以着重在建模出正确的形状就好,
丢进去游戏里就会自动看起来正确。
虽然作者也说做出一套可以完全覆写掉 Unity 光线表现的机制就花了他一整年,但成果
就是可以一人做出相当规模又有特色的开放世界。符合我之前做的研究,能够相对低(人
力)成本地实现高品质的表现。
三、实验
由于我原本三月的研究就已经覆蓋到了只仰赖 Shader 表现建物,这次全面性的光线表现
覆写实验中,我想要做性质更加歧异的方向。
于是就决定表现看看沉在水底的都市样貌。
目标就是从素模:
https://imgur.com/YVODxBc
变成这样:
https://imgur.com/9FK3uoO
四、实作
以下就开始讲述一些为了模仿水下表现而尝试的东西。由于我的 Shader Code 研究还不
够充分,因此实验中是使用 Unity 2020.2 的 Shader Graph 制作。
(一)波纹
https://imgur.com/J0hjjp6
应该有很多人在触及水面 Shader 时都已经知道了,Voroni 图姑且可以表现出像是水的
波纹的感觉。在这个例子中,对于所有 Shader 都进行一个上往下的正投影表现。
(二)沙子
https://imgur.com/m61UYRk
基本上沙子有与无的堆积可以使用 Gradient Noise 的密度去表现,根据世界高度来决定
就可以轻易表现出来。
(三)沙丘
https://imgur.com/eftBRGR
同样根据 Gradient Noise,只要调整地板模型的顶点(Vertex)就可以营造出高低起伏
。
(四)远景渐层
https://imgur.com/WeGTLCF
这部分用了一个从《空战猎鹰》作者学来的手段:直接在玩家周围围一颗半透明的球。
https://imgur.com/ETDpBjV
写一个 Shader 根据镜头距离控制这颗球的颜色、透明度,将颜色分别渐变两次。
这颗球也就充当 Skysphere 使用,写了一个表现水面波纹的表现。
https://imgur.com/SImV5ax
(五)闪烁的沙粒
https://imgur.com/SabpLWw
波纹所使用的是 Voroni 图的边线,将它倒转的话就变成了“点”。过去曾经用来仿造星
空,用来散播某种性质的不规则点,拿来当闪烁的沙粒也非常适用。
三天实验的测试,全部加在一起就变成了这样:
https://imgur.com/w1IYMZX
最后完成的 Shader 基本上就是有一些共同使用的子 Shader 去固定处理像是波纹的投影
表现,确保跨 Shader 之间呈现出来的波纹是一致的。
五、延伸
这里流水帐地提一堆可以额外改良的空间:
-波纹不需要只用正投影,可以根据时间变化有角度的改变
-所有表现都可以纳入深度会降低光线概念处理
-任何噪声都可以用好几层噪声去叠,避免高处观看时会有规律感
而最后,确实依然可以说这样的画面还是缺乏精细感,也因此或许不需要正面对决,而是
可以刻意使用低分辨率表现:
https://imgur.com/R4c7Q5f
就像《A Short Hike》的低分辨率完全是为了隐藏表现能力的不足,但也没有因此而影响
游戏体验,反而增加了相对于有限分辨率的圆满感。在玩家太容易被画面精细度、密度影
响评价的时代中,显然是个有价值可以利用的手段。
六、结论
《空战猎鹰》的作者说他“当年为《上古卷轴五》制作模组时发现只要使用噪声就能表现
出雪”而感到感动。确实在这次的实验中我也觉得相当地有趣,无论是哪种表现,实际上
都只需要靠噪声、投影就可以轻易制作出有趣的视觉效果。
虽然精细度、密度上比起 3A 作品远远不足,但也无妨,这样的手段反而可以确保仅仅一
人的愿景得以实现,而不需要永远只感叹于人力上的不足而难以行动。
当然像这样的表现也只适合用在几乎仰赖环境光源的设定,例如说如果要自己写一套机制
可以让街灯等光源真正提供颜色的话会比较麻烦,这就是需要取舍的地方了。
大概这样提供参考。
如果愿意听英文的话,最近《空战猎鹰》的作者有一部非常详尽的访谈影片:
https://youtu.be/5d8tx6K6hkk
基本上可以说是只要照着这部影片逐步实作,就可以完成一个视觉跟《空战猎鹰》同等级
的作品 XD
只是要完善化配色、用自己的方式覆写掉整个光线表现或许会需要跟作者一样就使用上至
少一年以上的时间,但在那之后就会换来一套可以自由创作的开放世界的空间了。