好吧,今天和大家分享一下3D游戏中美术资源的优化。才想起来,我也是小白一只啊!但大虾都是由菜鸟而来的(这逻辑好奇怪),不懂就多问、多想、多查找吧,我也是凭着这种信念,才有了这一篇文章。
之前制作游戏模型的时候,不会考虑太多性能优化的问题,程序组需要怎么样的素材,素材的标准是怎样的,我们美术组按着数据来制作就可以。一般来说,独立模型贴图的尺寸是512或者1024,都是一张贴图对应一个材质球,给一个模型使用。但这做法是我几年前所了解到的,时至今日,这标准是否被淘汰了,我自己也不知道。我只能说一下,我现在所了解到的和体验到的,一些关于材质、贴图优化的事情。
自行测试
我们第三款的手机游戏还在策划当中,但主题和类型基本确定了,是一款城市建设结合经营类的游戏。对于美术有两大挑战,一是工作量大,二是对性能的把握。因为游戏中会有大量的建筑和物品,几乎是现实中存在的,游戏中就可能会出现,但这是不可避免的。所以对性能的把握,必须很讲究。我很早就开始性能测试的工作,如果在游戏正式制作前,不找到合适的方式,那后果将是毁灭性的。
一开始我就想到了共用材质球,但出发点不是优化性能,而是偷懒。我设定了20多个纯色的材质球,一明一暗的搭配,譬如我设定了一个红色的材质球,就会在这个红色的基调上,再增加一个稍微暗红色的材质球……建筑的墙体就用这些纯色的材质来赋予,也会稍微有明暗、层次的效果。至于建筑上的门、窗等其他物件, 也是共用一个材质球,它使用的是一张1024的大贴图,上面集合了各种门窗的贴图。我想着一款游戏下来,材质球不超过35个,优化性能是大可不必再考虑材质球方面了。
我把建筑模型导入到Unity中,摆设了一个建筑群,大约有650栋建筑,再调试了一个摄像机动画,测试文件就完成了。我运行了一遍,Batches数值达到3400多,Calls数值达到1300多!我惊讶了,原本对这些数值不敏感,但铭显告诉我越低越好,Batches值最好不要超1000。不管了,先导入到手机上运行看看怎么样。果然不出所料,动画很卡。虽然我当时考虑最多的是,会不会是建筑数量太多呢?但还是找了找优化方面的知识。无非都是要控制模型面数、共用材质球等等。这些都在考虑之内了。
材质合拼
后来铭显给了我一个新概念——材质合拼,他说将多个材质球合拼到一个材质球,可以达到优化的效果。但材质球是怎么样合拼的?我功力不够啊!难道是用鼠标拖着这个材质球往那个材质球上拽吗?这时我想到了多维材质,但多维材质使用起来也不方便啊……如何将那么多色块集中在一个材质球,而又不是多维材质呢?贴图!还是贴图!我将所有的色块都集中在一个贴图上,加载到一个材质球上使用就可以了。之前设定的20多个纯色材质球,瞬间变回1个。虽然使用起来需要展UV,没有之前那么方便,但由于是色块,没有涉及纹理,所以展UV不用太讲究,大大咧咧地将UV拖到想要的色块就行。后来我再做进一步的调整,把色块和门窗等等物件的贴图都集中在一张4096的贴图上,这样材质球就更少了。但为什么是4096呢?铭显告诉我,超过4096的话,Unity可能会不显示。
调整后的测试数据很乐观, Calls数值只在30左右跳动。在手机上运行的话,前期加载的时候会卡顿,但加载完后动画非常流畅,这算是测试成功了吧?
又陷入迷惑
有位朋友Camel,在国内某知名游戏公司任职美术主管,和他聊起这个话题,他说我这种做法和他们的不一样,他们是一个模型对应一个材质球,使用一张512的贴图。但具体为什么要这样操作,他也不懂,他是纯美术大牛,对引擎技术也是一片空白。我瞬间凌乱了,还抱着一丝希望问他:你们开发的是手游吗?
——是啊,就是手游。
——靠!我还以为是PC端呢!
人性往往都是这样的,会仰望权威,对我而言,Camel和他的公司都是权威。当自己的行为和权威不一致时,又开始怀疑人生了……为了去掉心中的雾团,我整理了两张图片(如下),一张是共用材质的示例,另外一张是一个模型对应一个材质的示例,委托他咨询一下技术总监,这两种做法,我该如何选择。
(图一:多个模型共用一个材质球,使用一张大贴图)
(图二:一个模型对应一个材质球,使用一张小贴图)
非常感谢Camel和他们的技术总监,给了我很明确的答复。他们建议我一个模型使用一张512的贴图,因为贴图太大会消耗GPU;一些可以重复利用的模型,比如,门窗、屋顶等等,可以共用一张贴图,这和我先前的做法是一样的。我又按照这种标准测试了一遍,Batches值和Calls值都不低。因为有了第一次的测试,所以这结果也在意料当中的。
那我究竟应该选择哪种方式呢?一个是知名大公司使用的方法;一个是数据看起来很乐观的方法……
再次求证
正当非常困惑和懊恼的时候,我想起了另外一位朋友阿莲也在游戏公司任职美术师,我马上和她联系上,人啊!就是现实的动物,正所谓无事不登三宝殿,我都懒得跟她寒暄了,直接告诉她我所面临的问题。
她说:“我不懂啊!”
——这……这……这叫什么话~
——“不过我可以帮你问一下技术”
“那赶快啊!还愣着干嘛?”这句是我的心里活动,没有说出口。
很快,她答复我说,Unity场景可以看情况共用一张或者两张4096的大贴图;角色最好就独立使用512贴图,因为角色有可能出现在不同的场景,每次都为了这角色,调用一张4096的贴图太浪费资源了……
这意味着什么?这意味着4096的贴图是可以使用的,就是说,我最初的方法还是行得通的!所以,我第二次的测试算是成功的吧!
很多事情,实现的方式多种多样,制作同一个3d模型,有人喜欢用Max,有人喜欢用Maya,无所谓好坏,用习惯就好。很感谢我这两位朋友Camel和阿莲,还有给他们技透的总监^_^,让我学习到不同形式的优化方式。虽然我很大可能是使用第二种方法,但不能说第一种就是错的,文章一开始,我就说前几年了解到的制作方法,其实就是第一种。而且,我没有和Camel说明白,我制作的是什么样的项目,项目不一样,往往要求就不一样。假如用第二种方法来制作次世代游戏,估计就不现实了,因为次世代模型有纹理贴图,法线贴图,高光贴图等等,每种贴图集合成大图,再分别对一次UV,结果是累死,各种贴图还未必对得上位置……
有些知识和经验就是这样在曲曲折折中获得的,虽然伤神,但印象深刻。以上就是我开始新项目时,纠结怎么样使用贴图材质的一些事情,当然啦,3D美术资源的优化不仅仅是贴图,还有很多更为重要的方面,我笼统地归纳一下,有不对或欠缺,请看官补充:
- 注意模型的面数
- 尽可能地将多个模型Attach在一起
- 共用材质球,将多张贴图拼成一张贴图
- 贴图尽量使用16位而不是32位
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
关于UME Game更多的信息、开发日志、创业故事、技术分享……
请关注我们的官方号>>>>>
>>>新浪微博:@UME-Game
>>>知乎专栏:UME Game
>>>微信公众号:ume-game【或微信扫一扫下图二维码关注】
对于初学者来说,这货还是很干的。
@厦门-黑脉游戏:没技巧,就是经历,不懂技术的美工伤不起""-_-""
显存够大的话,一大张贴图性能最佳
@rein1:是的,但是因为我们是针对移动平台,所以不能用太大的图,而且对于动态物体,每次渲染都要载入一张大图也是很耗性能的
您好,我想问下您在文中提到“假如用第二种方法来制作次世代游戏,估计就不现实了,因为次世代模型有纹理贴图,法线贴图,高光贴图等等,每种贴图集合成大图,再分别对一次UV,结果是累死,各种贴图还未必对得上位置……”,我现在正处于您说的这种状态,模型对uv让我很头疼,请问现在业内有工具可以自动操作吗?