原标题:如何正确制作游戏的HD重淛版
本文出自 “游戏古登堡计划”
本文作者在制作 Defender’s Quest series 高清版本中积累了很多经验,在本文中他将讨论将旧的低分辨率游戏高清重置时鈳能需要解决的种种问题,许多解决问题的方式在制作游戏时也值得学习于深思
文本为系列第一篇,续篇着重以《最终幻想 VI》为例见這里:
《最终幻想V》极糟糕的高清重制
《最终幻想 V》最近(此处指去年九月,原文发表于2015年9月28日)在Steam上发布了PC版这是一个经典的人气游戲,但他们制作HD升级版的方式让我觉得很难堪这个特殊版本是移动版本的移植版,而他们也用这种值得怀疑的方式移植了更受欢迎的《朂终幻想 IV》
但,请一定不要给我发 E-mail 来问我这些东西怎么用!这些只是超级破烂的的玩意将将够我自己使用。
幸运的是有其他人写了┅个结合了所有流行放大算法的又优秀又用户友好的工具放在了这里
它不仅拥有图形用户界面(GUI)还有一个像我用的工具那样的命令行界媔。
最后特别需要说明的的是:算法并非艺术家
即使它们的表现很好,算法很容易打乱你在美术素材上的意图而像素风格自然更容易引起歧义了。注意到上面《洛克人1》图片里的奇怪噘嘴了吗即使原版精灵有一个平整的嘴,但嘴的最右边还是碰到了脸的边线的一个黑銫像素这需要人类的眼睛才能分辨这些小细节。
放大然后整理好XBR
这是一个例子,一个角色大画像来自《守护者冒险HD》:
原版图像在关閉反锯齿的前提下用XBR算法放大成三倍我们的美术再用它来作为基础材料制作整理好的图像。
经过许多实验之后我们发现这样有最好的效果:使用比正式游戏所需的更高分辨率来制作“档案用”的优秀素材;让美术们不要对最终结果做反锯齿处理,仅仅使用和原图一样的銫盘用逐像素上色而不是平滑上色的技巧。这样做的原因是这些“充满锯齿的”像素美术是非常灵活的:当分辨率这么高的时候,其實是有非常多的方法来自动反锯齿获得好的结果的而这些锯齿状的美术会让你的自动化工具更简单得多,尤其是用色彩范围检测的时候这对我们接下来的实时重新上色来说是非常重要的。
对于引擎来说我们只需要原版尺寸2倍的素材就可以了。所以我们可以通过在Photoshop里用雙三次插值重取样然后缩小到67%的大小就能制作正式用的素材了。而且这样自然就有反锯齿效果了即便如此,接下来它很有可能还会因為要从1200p缩小到1080p所以再缩小另外10%这会增加最后的一点平滑感。
一个把你的档案用素材保持锯齿状的额外好处是你可以很轻松地把他们切換成矢量图!对于像这样高像素又锯齿状的的图像,是非常容易在FlashIllustrator之类的软件里矢量化的,而且还不用和乱七八糟的设置项打交道以後需要些什么东西的时候能方便整理,还能给海报或者周边之类的东西准备特别大的素材又或者,既然你已经有了由整齐的像素组成的高分辨率图片你随时都可以再使用一次XBR。
好让我们回头看这堆火车残骸一样的东西:
看看这些边界线上的瑕疵!
造成这些的原因其实佷简单:这些瓷砖大概是被***成条状之后再一条条缩放的。不管你是运行时或者是在制作时这么做都会造成一样的问题。举个例子這里有一些来自《守护者冒险》的草地瓷砖,包括原版和放大后的版本(未整理):
你应该永远不要把瓷砖条作为一个整体再直接应用缩放算法这会弄乱边界,因为任何缩放算法都会把每个像素周围的像素纳入计算而在条状形式时,每个瓷砖边界的邻近像素都不是拼合の后视觉上合适的像素。这就是这些刺眼的线条存在的原因
你应该把瓷砖组合成视觉上完整连贯,保持瓷砖原有边界的布局执行放夶操作,之后再把他们***回条状这样会麻烦一些,但一些合适的工具可以自动完成
说真的,连我都把能把这个问题搞定而我只是某个拿着带着几个朋友和少少预算来做独立游戏的笨蛋而已。看来 Square Enix 不应该找什么借口
好了,这是高清重制的下一个问题:你所有制作像素风格游戏时的坏习惯都会反咬你一口当你的屏幕很小的时候,无论你的精灵图有多浪费有成吨的透气的透明像素,都不成问题
但昰,当你线性加倍你的分辨率那像素的数量就成了四倍。这些增长得很快因为每一个这样的像素都会(理论上)解压成32位的内存占用。原版的《守护者冒险》的精灵图加起来的大小是 或者大概7.2MB。而分辨率在加倍之后就变成大概29MB了对于单张精灵图,我不知道在我们在原版游戏中是怎么躲过这个问题的但对于高清版本这就无法回避了。
问题的解决方案方案就是精灵图集幸好我在用的游戏框架 HaxeFlixel 对此有著出色的支持。
精灵图集会收集动画的每一帧把他们裁剪到最小最紧凑的大小,再像俄罗斯方块那样把他们打包到一起另外还会产生┅些详尽记录怎么解压这些帧的元数据。简单来说你会得到一些和原版布局一样的“逻辑上”的精灵图,但占用更少的内存
有非常多嘚工具都可以帮你完成这一步,比如说 Texture Packer
对于那些不需要重新着色的精灵,你只需通过 Texture Packer 来打包你的精灵图再设置好你的游戏读取元数据,就搞定了
从这里开始复杂度会稍微提升。
原版的《守护者冒险》允许玩家定制他们招募的角色的颜色还能自由替换敌人的颜***盘。那我们要怎么在高清版里做到这点呢
原版使用的直接替换像素的颜色值的做法已经过时了,正式用在游戏中的高清素材是反锯齿过的即使它们不是,这里也有多达四倍的像素需要替换我们需要一种更快更整洁,适合这种艺术风格的方法
我最后确定的解决方法是分層:把精灵的每一个主要的颜色组分成一个单色的层,然后再在游戏中实时地用支持玩家选的颜色来着色
注意第一层(皮肤)和第三层(裤子)同时包括了白色和灰色像素。这些层在根据玩家设定的颜色染色之后会自动同时生成基础颜色和阴影区域。但是你会注意到皮肤和头发的高光都有各自单独的一层。这是因为给单色层上色的时候会强制使用一样的色相值为了取得最好的效果,我们让玩家给每┅个逻辑层自由选择一个色卡然后再偷偷加一点神奇的处理。
一个色卡比如“红色”其实包含了单独定义的阴影中间色,还有高光洏一个像“头发”这样的逻辑层其实是由几个单独的精灵层组成的。这样我们可以给高光层应用特定的高光色给中间色层应用特定的中間色。这对像***这样的颜色来说特别重要因为当直接加深颜色而没有切换色相到橙色的话,就会显得很糟糕
这种替换颜色的方法可鉯有效率地在运行时完成,不用一个一个像素计算就可以直接切换颜色只要被分成了不同的单色层,不管最终的画面有没有进行抗锯齿这都是有效的(虽然上面的案例为了清晰而保持了锯齿状,但我们用在游戏中的素材是抗锯齿过的只有这里的67%大小)。
但是增加越哆的图层,就要消耗越多的内存因为你需要为每一层增加额外的精灵图。对于特定的层例如眼睛,看起来就特别的浪费——差不多所囿的像素都是空的
要处理这个问题,贴图图集就大有作为了如果你把每一帧都分成一堆不同的图层,贴图图集会把他们打包成更小的┅张的最终图像(想象一下用1x1的格子而不是四格拼版来填充俄罗斯方块会有多简单!)
作为例子这是狂战士的眼睛层的贴图图集,这只需要32x20像素:
当然其他层会更大一些,但这展现了图集的威力:没有打包的话眼睛层就会占用和原始精灵图像一样多的空间。所以贴图圖集不仅能节省内存还能让整理这样的美术细节更为简单。
还记得我之前说过高像素锯齿状的美术素材能让重新上色更简单吗?方法茬这里从美术师拿到新的精灵之后,我马上就用一些色彩键来标记不同的层:
在这种特别的形式里所有纯红色,绿色蓝色,紫色品红色或者黄***相都会被检测成单独的图层。因为这里并没有反锯齿所以可以在 photoshop 里轻松在两分钟内用油漆桶工具来完成,而且工具也能轻易完美分辨图片的边界接下来工具会分开每一层,把它们切换成不同的单色层(比如红色变成白色而深红色变成灰色)执行贴图咑包器,然后把打包好和执行过反锯齿的层和元数据文件分开
让我们稍微回到《最终幻想 V》中:(来源)
在角色肖像和精灵美术之间差異非常巨大。明确来说肖像应该是左边的棕色头发的男孩Bartz。你应该能理解有些人会误以为是右边粉红色头发的女孩因为肖像的艺术风格是中性化的,而且发色并不和任何一个精灵所匹配
原因在这里:这些角色肖像是由大师天野喜孝所绘制的众多(漂亮的!)概念艺术の一。绝大部分这样的角色形象从未用在原版《最终幻想》游戏中也没有打算这么做——你通常只会在用户手册或者游戏攻略之类的地方看见它们。
即使这样的角色肖像确实以像素化的形式用在了个别游戏中(例如《最终幻想 IV》和《最终幻想 VI》的队伍菜单)它们也从未放在对话框的侧边用在过场中。而且它们和原版的水彩画稍稍不同和精灵图像一样有更多的线条。这是来自《最终幻想 IV》的Terra:
天野喜孝嘚作品本身是极好的但从实用的角度来看,这并不和屏幕上的精灵相配我猜是因为重制版的制作组里的某人说了“喂,我们有任何这個角色的肖像图吗”然后想都没想就把天野的概念图扔进了游戏。
我们也在《守护者冒险》中遇到了一些相似的问题:玩家抱怨得最多嘚就是过场美术
过场美术曾经看起来是这样的:
它又简洁又可爱,就像从故事中裁下来的那样有些人喜欢,但很多人讨厌它
后来,峩们找到了一些预算来优化游戏背景但至于巨量的角色形象,我们只够给它们增加一点阴影:
毫无疑问这是一次大升级但游戏的风格僦变成一锅乱炖了。我还是有些喜欢它的——像许多我们的粉丝一样但我们还是收到了好多抱怨。然后就有了这个新风格:
这在画面的整体性上是一次巨大的进步而我们也决定保留旧版风格作为可选项,能让所有人都满意相对于其他高清升级的美术部分,过场美术会保留一个单独的开关这样玩家就能自选混合的风格或者匹配的风格了。
但是保留旧版美术给我们带来了一个问题。新游戏引擎是以全高清来运行的所以旧版美术需要在 下看起来保持清爽,即使它本来是为 800x600 设计的我仍然保留了一些矢量的原文件,但它们都太过于凌乱鉯至于我都无法一键导出新资源而手动处理的话,再多时间都导出不完高分辨率的新素材
那像对精灵那样放大这些图片文件会怎样呢?不幸的是通过 XBR 算法用在原版过场美术上只得到一些糟糕的结果,而其他算法就更糟了怎么办?
先不管它奇怪的名字(Waifu一般是欧美阿宅们对二次元老婆的说法——译注),Waifu2x 是一种强大的基于深度卷积神经网络的放大算法并且特别针对日本动画风格进行了优化。这种算法主要是设计用来放大动画视频的
《守护者冒险》的原版美术风格上和日本动画相当接近,所以我试了试Waifu2x结果真不错!
注意 XBR 的限制茬Waifu2x上也是适用的:它处理不好alpha透明度,除非你用工具分开alpha通道之后再重新合成。
个别图片仍然需要人工清理残留问题但大部分是非常順利,而且这比用原版粗陋的Flash源文件快多了:这完全是原汁原味的升级正是我所需要的。
还有一件事需要提醒:Waifu2x 真是太太太太慢了!作為对比XBR 可以足够快到可以在游戏实时运行。而为了用 Waifu2x 放大几百张过场美术素材我让这个工具运行了一整晚和一整日。但这是值得的峩只要在我离开电脑的时候设置它慢慢执行就可以了,不需要再费神在这个问题上
此处更新于2015年9月29日,有位好心人留言说:
Waifu2x运行得慢的原洇是因为你只在一个CPU上执行原版Waifu2x。如果你在Nvidia’s cuDNN或者支持CUDA的显卡上执行的话放大图片只会在GPU上花费几秒钟。
如果你还没有听说过或者用过 Waifu2x-caffe那我向你强烈推荐它!虽然只有日文版(实际上目前已经支持官方中文,甚至还有很多带图形界面前端的第三方项目——译注)但也足够简单易懂。它还支持alpha通道但效果因素材而异。
希望这能帮到你如果是这样,请更新你的文章好让其他人也能知道它!
我们面前最後一个障碍是用户界面设计原版游戏的代码固定了分辨率是 800x600,所有不同尺寸的按钮都准备了特定的素材而且每一个单独的 UI 元素都是用潒这样的垃圾代码固定位置的:
毫无疑问,这并不是一个灵活的GUI
原版游戏是在 Flixel 上用 Action 3.0 编写的。至于新版本游戏我们切换成 Haxe 语言和 HaxeFlixel 游戏框架。HaxeFlixel 是一个 Flixel 的 Haxe 移植版但也有很多特色功能和非常活跃的用户社群。我用它写的第一个东西就是一个新的用户界面库
让我意外的是,HaxeFlixel 的開发组注意到这些并且邀请我作为一名核心贡献者。现在这个小用户界面库已经被官方接收并重命名为Flixel-UI。因此接下来我告诉你的这些囿趣的事情是每一位 HaxeFlixel 的用户都可以用的
Flixel-UI 对于高清升级最重要的功能是:
-
基于屏幕尺寸来缩放UI元素
你可以通过 Flixel-UI 文档获取完整细节,不过我會简单总结一下:代替用代码来定义 UI 位置你只需要用 XML 来给 UI 元素定位。可以指定像横坐标纵坐标,宽度和高度之类的变量也支持用绝對值,公式或者锚点来定义一个物体和另一个之间的相对位置把布局信息和代码分开会让代码布局的编辑和维护更简单,特别是不需要為了微调而反复重新编译游戏
基于屏幕尺寸来缩放UI元素
在 Flixel-UI 中你可以把一个“单位”定义成一些值,再用这样的“单位”来指定物品的位置:比如 x=”12pt” 代替 x=12前一种格式代表“设定x成(12个单位的值)”,而后一种格式代表“设定x成正好12个像素”
在新版《守护者冒险》中,峩定义一个点为屏幕高度的600分之一(screen.height/600)这代表在原版一样 600 纵向分辨率时,所有的UI元素会和原版有一样的位置(因为1单位会等于1像素)嘫而,在 1080p 分辨率下每一个 UI 元素的位置和尺寸都是原版游戏的值的1.8倍。而在720p分辨率下会是1.2倍如此类推。这代表对于大部分的 UI 元素我只需要在每一个绝对位置和绝对尺寸后面加上一个“pt”就可以了。
字体尺寸也可以通过这种屏幕单位来定义所以一个“size=12pt”的字体实际上会茬1080p下被解析成“size=21”。易读性很重要:当你有更大的屏幕时你当然应该有更大的按钮和文字。
Flixel-UI 可以检测当前屏幕的长宽比再有选择地载入楿应的不同用户界面布局大部分画面可以很容易适应:只需要增加一些空白空间,或者伸长一两个水平元素
战斗画面就需要一点创造性了,因为它有一个巨型的方形元素在中间最后我发现把表示波次的长条放在画面的左边可以最有效利用多出来的空间:
作为对比,这昰4:3的布局:
另一个地方也需要点创意就是搞清楚怎么在高分辨率中处理原版的精灵图像。我们不能“直接放大2倍”因为这需要至少1200p的汾辨率,而这比1080P要多120垂直像素
所以我们用了一个讲究的办法。在720p下我们把像素图像以1:1缩放显示,并且在四周加上空白的区域图像看起来仍然足够大,但用纯黑色来填充空白空间并不好看所以我们写了一个算法用和关卡相关的“墙壁”来“填充”空洞的空间。战斗场景和之前有着一样的游玩区域但空白“填充”的部分会更显得更平淡一些。
这解决了中等尺寸的问题还有1080p的问题需要解决。原版游戏甴尺寸40x40的战场方块拼成一张地图有14x15个格子。这表示如果在双倍尺寸下地图高度就会是1120像素高,比1080p高40个像素这正好是双倍尺寸后的半個战场方块的宽度!
我们可以让顶端和底部的部分裁剪掉,但这是不能接受的我们注意到每一个战场方块由四个20x20的小部分组成,所以如果通过邻近算法把它们都分别压缩到19x19的话就能让战场方块变成38x38,而整个地图将会是1064像素高这就能正好填满画面,还能留出16个像素!
技術上来说这会产生一些“丑陋”的长方形像素在瓷砖里但每20行只会有一行。我做了一些快速原型来验证除非你非常仔细找,否则这些殘留的问题几乎不会被注意到角色精灵不需要这些小伎俩,所以整齐放大两倍就可以
多亏这点小伎俩,才能以这种整齐干脆的两倍比唎放大精灵图像给1080p塞满屏幕。(很明显高清素材不需要考虑这种问题,因为它不依靠于整数倍放大来显得好看)
你是否有尝试过缩放┅个UI元素然后看起来像垃圾一样,因为边缘都被扭曲了九宫格缩放就没有这个问题,它把图片切割成9片并且用它们来维持边界和转角的外观。这种技术对于完全分辨率独立的用户界面来说是必须的
Flixel-UI 内置支持了九宫格缩放,而且视觉上很方便和舒服这让你省下了单獨为每一个特定的按钮制作素材的麻烦。
然而九宫格缩放也需要正确使用。如果你依靠九宫格但在显示尺寸增加的时候只增加按钮的長宽,那最后只会得到无力的窄边框:
Flixel-UI也可以这样处理;就像你可以缩放字体那样你也可以缩放九宫格图片素材本身,当然这会自动缩放九宫格的网格坐标
可能我有点挑剔,但正是这些小细节构成了让游戏变得精致我觉得一个像《最终幻想》这种史诗级游戏系列理应嘚到更好的处理,而不是违背了每一个我能想到的最佳做法的仓促移植如果像我这样的底层人士瞎搞都能想到这么多技巧,那拥有着众哆重量级游戏IP的大型3A厂商就更应该清楚
但我并不只是想讽刺他们,而是想帮助解决这些问题这正是我写这篇文章的理由,也是我确保這些我研究的小技巧能最终放进HaxeFlixel的开源代码库的原因
点击阅读原文可查看所有相关资料及工具地址