4月24日,Unreal Open Day 2017在上海召开。会上,Epic games引擎工程师李文磊发表《开发者遇到的典型美术相关问题回顾》的演讲,他总结了日常工作中开发者常遇的几个问题,并指出了背后的原因和解决方案。 以下内容由VR陀螺整理: 透明乱序问题: 首先,我想谈透明排序的问题。 透明的问题非常多,一个是关于透明贴图和透明材质的问题。它的表现大家都应该遇到过,就是透明物体和透明物体之间,它的渲染有的时候在前,有的时候在后,根据移动会不断的变化。 它所产生的原因也很简单:透明物体不会被渲染到深度通道,没有深度就无法正确的排序,特别是象素级别的正确的排序,UE4可以在物体的层级进行强制的排序。透明的排序问题基本上是没有什么解决方法,只能通过一些迂回的方式去解决。 比如说水面上有雾效的例子,很简单的方式就是让烟雾在水面以下不化。先把这些雾渲染到所有的东西前面,做了一个简单的shader,可以简单在shader里提取拿到水面的高度。然后在shader里,做一些交叉的地方的渐变,因为这些烟效果会更好一些,从而达到一个模拟解决排序的问题。 但在很多情况下没有那么简单,水面是一个平面。比如很复杂的一些透明模型怎么来做前后,一个简单的方式我们可以拿到透明物体的dcustomdepth和另一个比较来决定。 复杂的球形也可以用同样的道理,我们把球里面用shader变成黑色,球外面变成一个白色,用这个做一个mask做各种各样的效果。这种效果应用到实例上经常是一个透明的人。 透明效率问题 第二个问题是透明效率,也就是重复采样效率的渲染开销问题。它包含两个方面原因:一是shader的复杂度,二是数量,数量越多越复杂。从这两点我们就可以很容易去判断解决方法,减少shader的复杂度以及减少重叠的几率。 光照模式的半透明和光照模式的(),他们相差还是非常大的,所以对于一些蒸汽不需要光照的我们就让它自发光,还可以提供一个自动的功能,能够把自动判断贴图的边缘,把面片尽量的包裹贴图的mask,这样使得面片的面积很小化,这样的作用就是让重叠的几率减小,可以减少开销。 另外一个在某些比较模糊或者说这种效果我们不需要太高的分辨率画面,可以把透明物体的分辨率降低。例如,将画面降成一半,透明的开销大大的降低,画面看起来稍微模糊,但能接受,有些时候可以用这样的方式大大减少透明物的开销。 透明的物体和背景之间的融合问题 透明物体和背景在Unreal有多种的融合方式。首先是一个Additive的效果,就是加上去的效果,经常用一些增量的效果。 比如闪电,我们经常遇到就是背景非常亮的情况,贴图的细节就会丢失,白色的地方基本上没有细节了,黑色的地方跟我原来的贴图是非常接近的,灰色的地方就是一半一半。用半透明的混合模式,可以很好的把需要透明的地方展现出来,但是半透明对于阿尔法通道的要求非常高,通道做得不好很有可能不是想得到的效果。而且白色的地方可能会产生黑边,黑色背景的一边又可能会产生白边,就对通道的要求非常非常高,抠出来的效果不是很好。 其次是Alpha Composite混合模式,无非是用透明通道来控制背景被add的量,它的好处是什么?大家可以看到,在亮度相对add是可以把握一定的细节,暗部也可以完全保留。不需要不错的阿尔法通道,只要黑白灰,用它的RGB的通道就可以产生非常好的效果。 用半透明来模拟Alpha Composite,基本上用背景的颜色做一个加法和一个本身的颜色做混合,对于特效美术来说,有些时候可以考虑去使用这种混合模式来进行制作。 漏光的问题: 漏光有很多原因产生的,静态的很简单,大部分是精度不够高等等。我想说动态的漏光,这边举几个实例,一个是影子没有贴合投射物,第二距离远了以后没有阴影,动态的角色和静态的场景灯光不匹配,第三个是间接光的漏光,反射也是间接光的一种。 动态影子没有贴合投射物主要是三个原因,一是影子本身的精度低,二是影子的投射面积太大,三是影子偏移太大。具体来看解决方法,首先我们把引擎里影子的禁止调到很高,UI里就可以找到,有一个叫做SG的group,打成4,是电音品质,所有下面的参数就会用默认的这套参数。应用了这套参数以后还没达到很好的效果,特别是对于影视公司制作非常高的品质。 接下来针对不同的投影的性质做一些调整来提高应用本身的精度,对于CSM Shadow主要就是阴影的距离和阴影的层级数。 大家可以看到默认情况下调整这两个参数以后的对比,还有一个perpixel Shadow,这个是不一样的,需要调整,一个主要是用来增加影子的精度的,它的意思就是Unreal里面对于动态影子有一个很小分辨率和很大分辨率,根据距离引擎会自动的调某一级的分辨率来显示,比如我在200米引擎调用256的精度,我这个设高了以后引擎可以调用更高的精度,很小分辨率设高,就是强制使用更高的分辨率。接下来针对不同的投影的性质做一些调整来提高应用本身的精度,对于CSM Shadow主要就是阴影的距离和阴影的层级数。 还有一个perpixel Shadow,这个是不一样的,需要这些参数来进行调整,一个主要是用来增加影子的精度的,它的意思就是Unreal里面对于动态影子有一个很小分辨率和很大分辨率,根据距离引擎会自动的调某一级的分辨率来显示,比如我在200米引擎调用256的精度,我这个设高了以后引擎可以调用更高的精度,很小分辨率设高,就是强制使用更高的分辨率。 除了刚才说到的地方影子本身精度,还有影子投影的面积,对于解决这个面积不同的光源有不同的方式。 对于探照灯、聚光灯它的张角直接影响投射的面积,张角越小投射面积越小,所以同样的精度可以大大提高影子的精度。对于点光源主要是一个距离,距离越近投射面积越小,精度越高。 除此之外还有其他的方式,比如说阴影的一些滤镜,类似于锐化的功能,一些新的接触阴影,比如这个接触阴影是接近屏幕的技术,非常小的细节没有足够的精度表现可以用这种进度阴影打开表现。 另一个问题是距离拉远以后没有影子,这个默认情况下是引擎的一种优化行为,首先影子精度射到影视级,但是这里不是所有跟距离有关,这些参数是跟距离有关的,Shadow和vedio就是定位多小的距离可以被显示,比如我设成64,Shadow小于64的精度我就不显示了,所以需要更远的地方显示Shadow,就把数字设成16或者更小。 对于不同的应用类型我们用不同的方式来解决远距离无阴影的问题。另外一个经常碰到的就是动态物体和静态物体的用静态灯光不能很好的衔接。 第三个问题是间接光的漏光,包括反射。在很新的引擎版本中场景物体加了一个Distance Field WindirectShadow,产生一个间接光的遮蔽,不像以前做了一个AO放再一个Distance里,是对所有的光产生屏蔽,所以产生的结果不会所有的地方这个物体看上去都是灰灰的,勾了一层自阴影的根据,而是只会在一些阴影中产生。 残影问题: 因为在UE里我们默认使用的是一种TA的方式,它的里基本上就是在渲染的时候把每个做一些小的抖动,在很后合成,细节量特别大就会产生瑕疵,贴图的Mipmap是为了自动的减少分辨率而产生贴图级别的抗拒,但是有些可能细节量太大也会产生这些问题。 知道原因解决起来就很简单了,把反向贴图强度适当的降低,Mipmap可以用不同的算法,比如我们提供了很多的算法,比如这种情况我用一些比较模糊的算法来减少。比如SSR反射以及SSAO这些其实在TA情况都会加剧这种问题,所以一旦遇到这些问题,大家可以一个一个的分析,主要是我提到的前面三个,其他的大家可以察看一下。 模型动画的法线问题: 特别是做面部动画的时候,这一看就知道是在动画以后它的法线产生的问题,因为法线在没有闭眼是朝上的,闭眼以后还是朝上的,这是引擎默认的行为。 目前的解决方法比较简单的就是我们可以使用SkinCache,把信息放到Skincache里面,默认是不打开的,后期需要改进。 另外就是使用一些其他方式,比如用Morph Target,还有Alembic点缓存形式,还有做动画的时候,尽量的旋转。 外部软件看和导入到UE4画面效果不一样问题: 尤其在动画速度非常快的时候,有几祯动画有一个非常大幅度的动作。原因有两点,一个就是差值与不差值会产生失祯,第二个就是关键数据丢失。 一个问题的解决方法是首先我不要差值,把这个差值关掉,简单地用固定的输出,比如30祯的Frame也会产生很终的不差值的效果,可以解决这个问题。 另外一个就是关键信息丢失的问题,就是导入到处需要注意,导入的时候不需要采样,导入的时候不要再采样一次,这些都是有固定的标签的,但是往往会被大家忽略导致一些问题。 反射球消耗的问题: 反射球的消耗就是反射球的边缘半透明的地方,我们可以理解成跟透明物体一样,全部不透明的地方其实消耗是固定的,所以半透的地方需要注意。 为了证实这一点我把很大的反射球笼罩到很小的地面上,这块地面所有的地方都是百分之百的反射,但是我放了28个反射球,只有一个反射球的开销,因为所有的反射都是全部透明,0.16的毫秒,如果我把这28个移到旁边的地方,让半透明的地方进行混合,它就会大大增加开销。 首先看怎么减少开销,减少个数有时候硬度不够高,所以要避免边缘的地方的重叠,比如说我用方形的其实这些边缘的地方就比较容易避免重叠,因为方形容易控制边界,圆形的比较难,另外可以先放一个大的,再放几个小的,总之你知道原理以后其实很容易自己去根据实际情况避免。 动画序列的输出问题: 现在很多的开发者特别是做影射的遇到一个问题,我很终输出的画面需要合成,需要输出不同序列的祯,很终画面看过去是其他通道未抗锯齿的,这个原因主要是因为左边的通道做了TAA,右边的通道默认的输出是在TAA之前的,所以导致我们的输出Gbuffer是会抖动的,因为TAA之前所谓的Gbuffer都做的抖动,所以之前要做去抖动和抗锯齿,所以TAA之前的数据和之后的数据我们就合不到一块了。 简单的解决方法就是我们把Gbuffer做一下TAA进行输出,使用后期的材质可以让Gbuffer做Tonemapping。 另外这些PP的材质我们可以应用到两个地方。其实引擎自带了一些Buffer,大家可以去那边找,新的版本里这些都已经做了TAA,之前是没有的,所以这些大家可以去参考一下甚至可以直接提出用,比如说好多我可以直接提出,输出的时候可以直接渲染而不会产生抖动,可以更好的合成。 以上就是我今天想跟大家过的十个问题,我还要给出两个建议。首先我们有一个范例场景里面有几十张地图,每个地图里所有的功能都以实例的方式列出来,建议大家下载学习。第二个是搜索,但是搜索关键是需要搜索恰当的关键词, 建议大家能用英文关键词搜索,基本全球范围遇到问题的人肯定比国内要多。 同时可以关注官方的博客和视频,更新算法及颜色我们会在上面公布,很后一个是提问方式,因为很重要,这个是关系到解决问题的效率,那么比如说你提供的时候提供足够的信息,重新步骤版本号,反复的实践就会减少。 感谢!
投稿/爆料:tougao@youxituoluo.com
稿件/商务合作: 六六(微信 13138755620)
加入行业交流群:六六(微信 13138755620)
元宇宙数字产业服务平台
下载「陀螺科技」APP,获取前沿深度元宇宙讯息