搜索 Unity

设计深邃的太空:《Crying Suns》里的视觉特效

2023年2月6日 类别 游戏 | 8 分 阅读
Designing a deeper space: Visual effects in Alt Shift’s Crying Suns | Hero image
Designing a deeper space: Visual effects in Alt Shift’s Crying Suns | Hero image
分享

Is this article helpful for you?

Thank you for your feedback!

在这篇客座博文里,Alt Shift的首席程序员Christophe Sauveur解释了《Cring Suns》冷酷深空世界的打光方法,并提供了可供参考的渲染提示与资源。

A look at the command center in Crying Suns
《Crying Suns》的指挥中心

《Srying Suns》中,玩家大部分时间都会在上图的指挥中心里度过。除了游戏的角色外,我们的另一个主要卖点就是外太空:深邃、变幻莫测的外太空。这是《Crying Suns》里必须显得冷酷的元素。为此,我们花了大量时间来调整各个环境的渲染,直到对这款多平台游戏感到满意。

艺术性渲染

《Crying Suns》对太空的刻画并非完全符合物理学。《Crying Suns》有着独特的美术方向,作为2D游戏也有一定的表达限制——即玩家能在屏幕上接收到什么。

人们通常会在一片漆黑的背景上贴上几点白点用于表示星空。也这是为什么大部分的太空船——无论是科幻的还是真实的——都是白色的。这样一来,飞船首先便于分辨,可产生更好的电视效果。其次,白色有助于反射光线和热量,黑色材料则容易吸收。

然而,我们希望在《Crying Suns》里打造更为阴沉、黑暗的世界,所以白色并不理想。即便如此,我们摄像机的镜头会直接指向各个星系的星星,其他星体只会在背面受光,面向镜头的部分多为黑色的。所以我们得找到一种解决方案来解决该问题。

多层次太空

尽管我们从一开始就有着明确的美术方向,但实现的过程却经历了一次又一次迭代。渲染的每条通道都有着独特的用途。

首先,我们渲染出不透明物体,如下图的太空站(左侧)和“Neo-N”魔方(右侧)。

Rendering of opaque objects in Crying Suns, with a big station (left) and Neo-N cube (right).

其次,我们在背景加上天空盒。我们本来也有其他的方法来做背景,但Unity的背景就是这么做的。

Similar rendering to the opaque example but with the skybox added in the background.

之后,我们加入透明物体的渲染,特别恒星与行星。

Continued Crying Suns render example that introduces the transparent render queue, including stars and planets.

到这里,“常规”渲染部分就结束了。剩下要做的就是泛光(Bloom)这种后期处理效果。

Continued Crying Suns render example showing the post-processing effects, like Bloom, that need to be done.

一般到这个时候,我们的制作人及编剧朱利安·科崔特(Julien Cotret)就会叫了:“泛光?你疯了吧?还是想让我去世?选一个吧。泛光还是我?!” 但是有了泛光谁还要制作人呐,是吧?

总之,到这里还没做完。游戏看起来很棒,右侧的Neo-N魔方形状分明,但左侧的太空站好像消失在了黑暗的太空。总体的氛围仍有缺失。

假装也是一种实现

为了继续改进,我们需要突显出太空站,使得太空站要显得比远处的星星更近。即便效果不完全符合物理,但看起来仍是太空的样子。这种效果称为“太空雾霾”(space haze)。

Example of hazelike (fog) effect created for Crying Suns applied to the rendered scene.

我们设计了一种发光效果,让光线在触碰到微型粒子时四处散射,产生类似于霾的东西。就我所知,太空里并没有什么雾霾,不过它看起来特别酷,对构图也很有帮助,还能给站点增添深度。

在远处查看同样的效果。

Example of hazelike effect created for Crying Suns from far away.

制作(太空)战争迷雾

那怎么做这种雾气呢?这个效果类似于屏幕空间里的迷雾,屏幕离恒星中心越远,雾气也就越少。

雾气的解决方案是在后期才提出的。首先,我们把一张巨大的展示板(billboard)精灵关联到主要的恒星上,产生一种模拟的发光效果,但这个效果没那么有效,无法影响到天体本身。

Capture of an early build of the game
游戏早期版本截图

在上图,可以看到恒星发出的光会为背后的天空盒染色,但飞船和太空站并不受其影响。他们朝向太阳的一面会更红,但剩余未受光的表面依旧是黑色的。

另一方面,如下图所示,雾气效果同时影响了背景和物体本身。

Example of the rendered scene in Crying Suns before and after the space haze is applied.
雾气效果应用前后对比

当然,游戏包含了多个位置(靠近太阳、远离恒星、参与战斗、遇见首领等等),我们必须处理不同的配置,并随玩家穿行与多个地点时无缝地切换。

The Crying Suns team's custom Inspector to adjust the fog settings between our various layouts
用于在各个场景调整雾气设定的自定义检视器

重现效果的步骤

若你想在自己的项目中重现这些效果,有两种东西最重要:深度纹理和后处理路径。我会详细解释通用渲染管线(URP)与内置渲染管线的制作流程。

Before and after example of applying the fog effect to a scene. (Notice how the cube pops out thanks to the fog.)
应用效果前后对比注意方块在雾气的衬托下更为明显

内置渲染管线

  1. 创建一份MonoBehaviour脚本,加入OnRenderImage方法,用自定义着色器来实现效果,并将脚本添加到摄像机上。
  2. 在Start方法内将摄像机的depthTextureMode切换为DepthTextureMode.Depth
  3. 调整摄像机的近处及远处截面,据此来计算深度纹理。
  4. 编写着色器。

URP

  1. 选中URP配置文件,在Rendering设置里启用Depth Texture
  2. 新建C#脚本,加入一个渲染器功能与提一条渲染通道,将其作为新的Renderer Feature关联到通用渲染器数据文件上。
  3. 调整摄像机的近处及远处截面,据此来计算深度纹理。
  4. 编写对应的着色器。
  5. 用着色器新建材质,将材质指定到渲染器功能上。
  6. 在功能里选择雾气的颜色。

看呐!

Alt Schift的《Crying Suns》目前一登陆安卓、iOS、Nintendo Switch™、PC和MacOS。请在 《Crying Suns》 案例研究中 了解Alt Shift如何用Unity来 让游 戏移动端、桌面端及主机平台,目前已吸引超100万名玩家。

Nintendo Switch是Nintendo的注册商标。

2023年2月6日 类别 游戏 | 8 分 阅读

Is this article helpful for you?

Thank you for your feedback!

加入论坛讨论
相关文章