Unity3D 图形渲染个人见解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/begonia__z/article/details/52198375

图形渲染是现在每一个游戏引擎最基本的功能,如果没有基本的图形渲染的功能,那么我们在玩游戏的时候就一堆代码呈现在眼前,这是何等伤眼睛的说。如今各家的游戏引擎都在图形渲染这块下足了功夫,CE和UE更是将图形渲染这块弄到极致的地步,CE和UE的画面都基本和电影画质一般,Unity3D一直以来都是主打多平台的功能个为主,Unity3D 4.x的效果以及画质一直是为人所诟病的问题,尤其是古剑和仙剑5出来之后,Unity3D更是被人喷的一文不值,在过内外大型的单机游戏都没有Unity3D的身影,正是如此Unity3D 5.x最大的改变也就是灯光渲染、烘培等下足了功夫,Unity3D 5.x的宣传片《亚当》CG短片的画质堪称电影基本的画质,甚至让人惊叹这是游戏引擎做得么?如果有兴趣的朋友可以去看看:点击打开链接 那么就不废话了,进入正题吧~

画面效果和性能一直是游戏引擎的两大难题,要想性能好就要那画面效果来开刀,要想画面效果好就只能拿性能来填补,如今很多人都往虚拟现实行业跳坑,VR行业更是如雨后春笋般冒出来,但是大部分的VR行业都是一堆人傻钱多的问题领导人,对于游戏引擎都是一窍不通的人,尤其是VR行业来说更是要命的问题,VR设备是一种非常吃硬件的设备,只要你的游戏性能优化不好就立马出现掉针问题,VR行业如今最求的真是的画面质感,如此一来对于图形渲染这块都要程序猿去优化处理的Unity3D就是一个老大难的问题,性能和效果都是要基于硬件配置进行调整效果,在不影响性能的前提下将游戏画面效果进行强制设置,这也是大型单机的常会自动调节性能最好的配置。

一、Unity3D的灯光渲染问题

Unity3D如果要做到效果和性能平衡,就要在项目初期制定硬件配置,那假设1080的硬件显卡配上VR设备,这样的配置Unity3D要制作60帧以上的流畅画面游戏,就相对比较难。因我们必须要严格控制模型面数和控制灯光数量,尽量避免使用实时阴影这些功能,因为这些功能会成倍数的增加模型面数和顶点数。

下面是cube在无平行光模型面数和顶点数,如图所示:


下面是实时平行光下的模型面数和顶点数:


这里可以看出,平行光的对模型面数和模型的顶点数并没有影响,这个是因为照射到模型面上的光的数据参数都是一样的,平行光没有开启阴影功能因此并不需要重新渲染图层上去,因此模型面数和顶点数都不会有影响,然后我们来看看开了阴影的平行光后,我们的模型面数会有如何的变化。如图所示:


上图就是开了阴影的平行光,可以明显看到模型的面数从14激增到64,更可怕的是顶点数从28增加到128了,这是为啥呢?

原理很简单,因为灯光开启实时阴影的时候Unity3D会根据你模型位置和灯光的参数计算出阴影效果,然后再模型上进行了多次渲染然后达到给模型附上阴影的效果。因此实时阴影是非常消耗性能的功能,因此在移动端以及VR上都不建议使用这个功能,最好的方法就是让模型让进行光阴烘培后再倒入Unity3D进行使用,这是我们就只需要打出简单的灯光进行补光即可。(PS:不建议在Unity3D上进行灯光烘培,除非你是大神级别的,我们之前项目用Unity进行灯光烘培后场景的感觉很难把控,而且模型常常出现黑斑)

二、Unity3D模型问题

现在最常见的就是,模型动不动就上万面有些更加离谱的是模型上百万面,然后倒入Unity里面直接卡死或者是掉帧非常严重,其实在游戏万级别的模型面数是基本很少见的,虽然硬件设备一直在提升但是并不是所有人都能配置上高配显卡,因此游戏场景常常会做3套以上的模型,然后根据你的自己配置来调用使用那套模型。因此我们需要根据项目合理制定模型面数,如果牺牲性能来达到效果的游戏,在玩家体验感上都会大打折扣。

但是现在虚拟现实公司并不会避免使用精模,而是为了幅度的开发成本使用高精度的模型,常常导致摄像机照到的面数和顶点数突破百万级的,然而官方给出的优化方法中提到,Unity3D的摄像机尽量避免超过200K到2M的顶点同时出现在摄像机前,这些要根据你的硬件设备进行调整,下面是Unity官方的优化说法:


这里肯定会有人说,那么让客户配置一个高配的电脑就行了呗,我告诉你这纯属扯淡,就好比我近期做得项目,整个项目模型顶点数已经超过官方给的峰值范围,出现在镜头前的模型面数达到惊人的千万级别面数,然而1080并不能拯救我们的说,就算将网格合并设置静态物体,都无法让1080上升到理想的帧数。模型面数和性能正是如此难以调节的问题。优化方式有几种,但是老板并不接受,所以我也懒得和他废话。这里肯定有人会问为啥会达到千万级别的面数,想知道的人可以私聊我。

那么如果想让自己的性能和效果达到理想效果该怎么办呢?

1、这样就要对模型进行详细的繁琐的调整,根据项目视觉范围制定中低模型。

2、尽量使用高模烘培后的贴图以及法线去修改成中低模型,远景就采用面片或者更加简单的模型进行替代。

有人会问如果远景使用面片这些能做出效果么?我可以很肯定的告诉你可以。之前的项目我们外包了一个桥的模型,然后给他们给过来的模型超出我们模型面数要求,因为项目是用在移动端上,而且桥作为远景来用,我们将烘培出几张贴图并且加上法线来加强它的凹凸感,最后的效果和万面级的模型一样。

所以在游戏引擎中,模型的精美是!=模型面数的,如果没办法做到将精模型做成中低模型,这个公司的终究会因为模型面数吃大亏的。(公司老板大部分都不懂这块,因此吃亏永远是我们程序)

模型精度固然重要,但是在游戏引擎这会成为性能的极大障碍,因此学会高精模转中低模型是非常重要的东西,细节的东西都用法线和漫反射贴图进行展示,这即可减少模型面数又不失模型的精度。

三、Unity3D纹理贴图合并

纹理贴图合并是一个美工必备技能之一,要做到是尽量避免使用重复的多张图片。神马意思呢?容我慢慢道来,就如刚刚的cube有6个面,一个面数都使用不用的贴图这样,就会有6张贴图的资源需要加载进去游戏引擎里面,虽然6次加载的时间并不是很久的,如果有一万个模型呢?那计算机就要加载6万多次,虽然对现在电脑来说并不是什么大问题,但是却要牺牲玩家时间进行等待。如果将6张题图都合并到一张1024*1024或者2048*2048的图里,这样就需要一次就可以加载完毕,对于纹理合并这块用过NGUI就非常有经验,将各种小图进行纹理合并形成一张大图,UGUI在一块虽然模糊了纹理合并的问题,但是到最后打包工程项目的时候UGUI还是会帮你打包成图集,这是为了节省加载以及优化性能上考虑。为此我们也要学NGUI或UGUI一样,将贴图都打包成 一张完整的16-bit或者32-bit图片。

为甚要这样做呢?因为计算机是通过二进制进行计算和存储的,我们使用2的N次幂有助于计算机内存的对齐,这样在性能上也有一定的帮助。所以在官方文档中也建议用16-bit或者32-bit的贴图,而且我常说的512,1024,2048都是2的N次幂。所以模型要对贴图的优化合并模型中的小图,减少小图的加载有助于Unity对模型的优化。

那么按照我上面的说法还会有一个问题,如果多个模型同时使用到同一种材质呢?这样我们就只需要一张即可,如果法线贴图不一样就生成新的法线即可。


以上为个人对Unity的渲染做出的个人见解,不喜勿喷,欢迎指出文章的问题。

(最后给各位学习Unity3D的新人来提醒,如果公司老板最对效果有最求而且不愿意花时间去弄模型的公司,建议尽早递辞呈,游戏引擎是没办法在很短的时间做到CG般的效果,因此他们都会牺牲性能来达到所需要的效果,如果你遇到一个让去优化一个千万级面数的老板的时候,你就会知道这是有多蛋疼的事情,就连1080也只有6-7帧的时候,你会感觉整个世界都黑了,然后老板还一个劲的往里面加面数的时候,你真的会觉得这个老板就TM给你添乱,所以千万别进到这样的公司~~~)


展开阅读全文

没有更多推荐了,返回首页