翻译自: https://techblog.kayac.com/unity-basic-rendering-configurations 之前看到过的文章,总结的很好!最近有时间翻译收藏一下
单击图像以跳转到WebGL构建。
本文是思考和尝试在为智能手机创建3D游戏时“暂时”做的渲染设置的记录。主要设定Item是
如果你考虑这些设置,无论你做什么,你都需要知道照明计算,所以我也会谈到它。
最近我有机会制作3D游戏原型,但即使我在Tekito中放置了几个立方体和球体,我的智能手机(Kyocera S2)也没有给出令人满意的帧速率。
因为DrawCalls和材料设置很少,而且我不打算写很多繁重的代码,所以没有理由让CPU变慢。实际上,连接Profiler每帧的结束时间为4ms。
罪魁祸首是GPU。说到GPU,它是顶点处理和像素处理,但它完全是像素,因为它不能有很多顶点。S2的屏幕分辨率也是1280x720,考虑到GPU性能,计算所有像素的3D照明将非常困难。虽然故事发生在十多年前,但即使像PLAYSTATION3这样的固定游戏也是难以忍受的解决方案。此时,通常执行称为“分辨率骗局”(部分)的方法,其中仅在1280x720处绘制2D UI,并且以较低分辨率绘制和合成3D部分。 不是Unity中的硬件缩放/SetResolution ,而是针对Camera的分辨率设置。
Unity独立完成各种各样的事情,但它并没有真正关注性能较低的智能手机。如果我正常使用,一个非常豪华的着色器将会爆炸。我想,“如果你真的没有认真思考,你就做不到。”
在这里,我将非常疯狂地解释3DCG中的光照计算。
如果您必须像游戏一样实时移动,则通过添加以下六个元素来粗略地完成照明计算。
“直接”,“间接”和“环境”三种类型,“扩散”和“镜面”有2种类型 ,两者的组合有6种类型。光是一个Light,无论是直接的还是间接的,并且将反射方式分为两种是很暴力的,因为表面的性质是无穷无尽的。请认为“这个结果是设计用可以完成的计算量给出好照片的结果”。
“直接”表示光源直接来自光源。如果太阳在没有任何东西阻挡的情况下撞击地面,那就是“直接”。
另一方面,“间接”是在被反射或折射一次的光照射时。太阳的光线反射在红墙上,它撞到地面,染成红色,就像一个人。
并且“环境”是来自“远方”的“四面八方”的光,例如天空和风景。因为它“足够远”,所以在场景中移动后可以认为它没有变化。
反射有两种类型:漫反射和镜面反射。
拡散反射(漫反射)
“扩散”是一种计算方法,当你像粘土一样不粘时。因为表面是粗糙的,所以它撞击的光将在各个方向上反射,并且从任何地方都是相同的。
另外,在认真做的时候,只计算非金属的东西。金属上没有漫反射。
镜面反射
另一方面,“镜面”是一个感觉马虎的家伙。夕阳在沙井中得到了惊人的反映,但这是一个指控,如果你稍微移动你的头,它将不会令人眼花缭乱。外观根据您所在的位置而变化很大。
并且,无论颜色如何,它都反映出光的颜色。如果它反射太阳,黑暗的沙井也会发出黄光。如果你认真对待,金属只是这种镜面反射。
同样,这种划分是为了方便,根据实现方便性,机器性能,期望的表达等,它可能完全不同。但是,在理解Unity的标准着色器时,可以说它是一个非常有用的分类。
让我们看看这六个特征中的每一个。
1.直射光的漫反射
朝向太阳斜对面的区域是明亮的,而对面是黑暗的。
因为它是直射光,所以只有一条路径。我不考虑在某处反射或弯曲。处理负载与光源的数量成比例。
此外,因为颜色不会根据您所看到的位置而改变,如果光源不移动且物体不移动,则“提前保存为纹理(例如”bak“和”bake“)您可以仅使用它进行优化。这是一张光照贴图 。
如果来自光源的路径被某些东西打断,那将是一个阴影。计算这个是一项非常繁重的任务。需要一个称为阴影贴图ShadowMap的过程,所有事情都将是DrawCall。
但是,如果光源不移动或物体不移动,您也可以烘培阴影和光照贴图。在这种情况下,运行时的负载不会改变是否有阴影。
来自Tecateka和太阳的光线被反射。
只有一条路径,因为它是直射光,但与漫反射不同,它具有根据观察位置而变化很大的特性。通常,很难在3D游戏中固定视角,所以基本上你可能会认为它不会在光照贴图中刻录。但是,还有一个选项可以使用以下规则进行刻录:
另外,因为使它发光很好的公式非常复杂,所以它会很重。对于StandardShader,材质具有是否激活它的标志。这是"Specular Highlights"。您可以使用不那么脆弱的材料切割屏幕上出现的大面积材料。
此外,镜面反射产生的颜色具有与物体颜色无关的特性。它可能是红色或黑色,但如果灯是白色则为白色。
阴影与漫反射相同。通常我们与同一个着色器一起使用。
因为绿色墙壁在左侧,所以面向左侧的表面被染成绿色。相反,因为右边有一面红墙,所以面向右边的表面是红色的。
嗯,光线可以来自光源,如红墙和绿墙。墙上有一个区域,所以光线来自墙壁的哪个位置?实际上,在智能手机上运行时,每帧都不可能进行这种计算,即使使用大量近似值进行加速也是如此。
但是,由于它是漫反射,因此颜色不会根据观察的位置而改变。这意味着如果灯光不移动或物体不移动, 您可以烘培到光照贴图。
那么这也有一个阴影。准确地说,它是“阴”。它不是一个明确的光源,如太阳或荧光灯,但各种各样的光源来自各个方向,所以它看起来像一个阴影,而不是一个清晰的阴影。例如,它背面是黑暗的,对吧?它在鼻孔内看起来是黑色的。这也可以刻录到光照贴图。
此外,如果您想要进行此计算,即使它正在移动!您可以通过计算和存储大量“来自周围环境的光线来替代它”。在Unity中,这 称为LightProbe。
LightProbe用于计算移动对象的间接漫反射。根据位置,如果LightProbe的数据是明亮或黑暗,进入室内的人可能会在外出时看起来很暗并且看起来很明亮。
有些地方是红色,绿色和白色。红色区域从左侧红色墙壁反射,绿色区域从右侧墙壁反射。白色将是空的。像这样,周围环境得到反映。
这也有无数的光源,无数的路径,并且颜色会根据您所看到的位置而发生巨大变化,因此您无法在光照贴图中进行刻录。
但是,与间接漫反射的情况一样,如果事先计算出“当你在这里时来自周围环境的光是这样的”的数据,你可以做类似的事情。在Unity中,这 称为ReflectionProbe。
但是,由于每件数据量远大于LightProbe,因此无法存储太多。当我想要做的事情,我喜欢周围的景色反映在Tecatka的金属物体中。
总的来说是蓝色的。它几乎是空的颜色。
这是来自“远足”“所有方向”的光的漫反射。天空或地面将成为光源。地面反射了天空的光线,因此地面没有发光,但如果地面发光则更容易。
例如,蓝色光来自天空,黄色光来自太阳,地面是草,所以深绿色来。它不依赖于您所看到的位置,因此“如果事物不移动”,您也可以将其烘培到光照贴图中。
缺点是没有阴影。如果你不关心任何事情,当你在屋檐下时,你会得到“在天空中降落”,但在这种情况下,你可以使用LightProbe代替并使用它。
也许环境漫反射被实现为“只能在默认情况下关闭而不能关闭的LightProbe”,并且当LightProbe存在时(似乎没有严格确认),似乎不使用此数据。相反,如果整个舞台是开放的并且没有放置彩色发光物体,没有LightProbe感觉很好(体育场就是一个很好的例子)。
另外,由于这里固定了“可以认为足够远的光源”,因此如果插入太阳,室内荧光灯和路灯,则可以在计算环境光时包括直射光的计算。但是,不建议使用明亮的光源,如太阳,因为它不能投射阴影。如果你有一个拥有大量光源的复杂场景(比如夜晚的城市),你会感觉很好,如果你没有锐利的阴影你也不在乎。
Environment Lighting
有一个环境照明设置, 它由此设置。
有一个略显苍白的地方。这是天空的反映。如果您使用Skybox材料将全景照片作为空白天空返回,您将看到周围环境的图片。
这是来自“远足”“所有方向”的光的镜面反射,并且像漫反射的环境反射一样,天空和地面成为光源。但是,与漫反射不同,无论物体的颜色如何,都会出现光的颜色,并且根据视线或位置,它会在反射的位置发生变化。它不会在光照贴图上刻录。
另外,我认为实现可能是“默认情况下默认情况下无法关闭的ReflectionProbe”。如果在MeshRenderer侧打开ReflectionProbe并且实际放置了ReflectionProbe,则似乎将使用它。计算的内容将是相同的。
直射光的漫反射 | 直射光的镜面反射 | 间接光的漫反射 | 间接光的镜面反射 | 环境光的漫反射 | 环境光的镜面反射 | |
可以烘培么? |
是 | 没有 | 是 | 没有 | 是 | 没有 |
它很重吗? | 光×光源数量 | 重×光源数量 | 无理 | 无理 | 光 | 光 |
你能在奔跑中获得影子吗? | 是 | 是 | 没有 | 没有 | 没有 | 没有 |
可以在运行时点亮吗? | 是 | 是 | 没有 | 没有 | 很重,但是 | 很重,但是 |
这很粗糙,但它几乎就是这样吗?
最重要的不是这个。
在普通游戏中,大多数屏幕应该是风景,而人们的移动不会占用太多区域。
片段着色器的负载与面积成比例,因此负载会根据您是否烘培景观(例如地面,建筑物,山脉或天空)而发生很大变化。移动物体占据的面积越小(或者数量越小?),烘烤效果越大。相反,在大型龙站立并在屏幕中间移动的游戏的情况下,它不能很好地工作。
现在,为了通过使用Unity的光照贴图减少负载,需要将gameObject侧的设置设置为静态。
如果将其设置为静态,将根据LightingSettings的设置创建光照贴图,并且将减轻光照计算。
烘培的缺点
烘焙使得计算在执行时无法计算的复杂间接光成为可能,并且可以制作的图像更加真实,但存在许多缺点。
首先,容量增加。您可以做的数据是质地,舞台越宽,舞台上的东西越多,质量越高,吃的越多。此外,每个光源设置的容量都会增加。如果你说“在同一个舞台上烘烤8种不同位置和太阳颜色的数据”,容量将是8倍,这实际上是不可能的。如果你认为“只改变光线的条件,便宜地进入早晨,中午,傍晚,夜晚的舞台”,容量将立即变得迟钝。
接下来,烘烤需要时间。创建高质量的烘焙数据需要时间,这会降低开发效率。在开发时,将在完成之前进行诸如低质量烘焙,掌握感觉和烘焙生产的操作。
最大的缺点是您无法在运行时移动对象或光源。如果太阳慢慢移动,它会变红,阴影会在晚上生长。您无法在运行时破坏建筑物,移动建筑物或随意布置建筑物。
如果绝对必要,你应该放弃烘焙。您可能还想要在不烘培精细阴影的情况下寻找好的图案(例如动漫风格)。
或者, 有一种像Ambient Occlusion这样的方法可以将质量提升到几乎相当于烘焙的水平。
但是,如果你想在智能手机的背景下有一些现实主义,那么说“现在烘烤”政策可能并不安全。
即使你决定烘培东西,也只能烧掉不能烧的东西。另外,存在移动物体和非移动物体之间的相互作用的问题。最好的是影子。
移动和不移动之间的关系如下四。请注意,为了清楚起见,我们将“不动”称为“建筑”或“地面”,将“移动”称为“人”。这将更容易传输图像。
一个人在一个人身上投下阴影
使用阴影贴图ShadowMap方法计算每一帧是标准的,但DrawCall加倍,阴影判断的着色器负载非常紧。
如果您的目标是无法承受阴影贴图方法的计算机,则此元素将被丢弃。在这种情况下,削弱直射光使其看起来像阴天,使得很容易摆脱没有阴影。
一个人在地上或建筑物上投下阴影
如果你只需要地面,地面是一个平面,你可以通过将模型的顶部投影到地面上并将其涂成黑色来绘制相对较亮的阴影。如果你无法忍受,最好在地面上放一个圆形的模糊板(假模型片),“Maruge”。如果地面上没有阴影,就没有接地感,这会干扰游戏,所以我们不能做任何事情。如果使用这些方法,“质量设置”中的“阴影”项将禁用阴影,您将自行完成。
如果要在地面外投射阴影,或者地面不平坦,则使用标准阴影贴图方法。由于拉伸载荷增加并且阴影判断的着色器载荷也取决于不移动的载荷,因此载荷显着增加。
还存在准确性问题。固定点的光照计算已经在光照贴图中烘培。从光照贴图中不清楚它是否已经是建筑物的阴影,它是否是晴天。如果它已经是一个阴影,如果一个人的影子落在那里它不应该更暗,但是不能做出这样的区分。
但是,如果你不想增加额外的计算,你只能忍受它,并且已成为移动物体阴影的部分,无论它是否已经是阴影,都将“减去固定值”。在Unity中,可以通过将“照明设置”Lighting Settings的“混合照明”Mixed Lighting设置设置为减色subtractive来完成。阴影的颜色将是固定的。
一个例子是阴影中的阴影。我将阴影颜色设为绿色,以便于理解。因为角色的位置在游戏方面易于理解,即使它像图片一样有趣,它也可以被称为蚂蚁作为游戏。如果你让它更精致,你可能不介意。
我试图将阴影颜色设置为Unity的默认值。...对不起,我很着急......
当然,如果你支付额外的负担,你可以防止人们的阴影落在阴凉处“阴影中的影子”。在Unity中,只需要制作混合光照Mixed Lighting 设置位阴影掩模shadowmask的Item。它可能具有“是否原始阴影”作为附加信息。但是,当然会很沉重。
这座建筑给人们留下了阴影
你可以用LightProbe做点什么。如果这还不够,你必须在阴影贴图上绘制建筑物和其他建筑物,计算量会大大增加。作为“暂时”的设定,没有。如果它意味着作为一种产品,将会考虑某些事情。
建筑物在建筑物或地面上投下阴影
没有问题,因为它被烘培i到光照贴图上。但是,如果您尝试刻录清晰阴影,则需要高分辨率刻录数据,这在容量和计算时间方面都很困难,因此基本上您将忍受阴影不足。
只要建筑物掉到地上的阴影被烘培,更重要的游戏就是人们掉到地上的阴影。没有这个,我们就无法理解事物的位置关系。由于像Marukyo这样的古老方法在使用Unity时很麻烦,我想用阴影贴图方法来管理,只需一个开关即可访问。
如果图片是Uri的游戏,我想瞄准顶部,但我认为这样的产品可能会切断廉价的智能手机,所以我认为我也应该使用SSAO, Realtime Global illumination
因为有一个非常棒的复选框。 ,尝试On是好的。
然而,“阴影中的影子”有点难过。如果你能看到负载并忍受它,那么最好使用Shadowmask。
人类视觉掌握了对比度强的部分的形式。因此,由于镜面反射是否存在高对比度将主导印象。但是,镜面反射不会烘培,因为它取决于视线。而且它很重。
Lighting Settings - Mixed Lighting - Lighting Mode照明设置-混合照明-灯模式 Subtractive
当,不仅影子落在在阴影中,静态的直接镜面反射将无法在所有的计算。它应该很轻,但它看起来很丑陋。
我认为,如果你真的制作了一款产品,但这次谈论的内容是“我们暂时在制作原型时会做的事情”,所以Subtractive
我认为没有镜面反射会更好。通常更好的做法是保持光线并添加元素,而不是制作重物并在以后减轻它们。
如果你习惯了很好的画面,你就不会想要削减它,你将不得不花费大量的时间进行调整和其他事情来使它成为一幅好画面。减少它是浪费,这是一个心理上痛苦的任务。
首先,如果游戏是开放的,我觉得没有LightProbe就开始了。如果它是一个角色在类似体育场的地方移动的游戏,那么就会有很少的障碍或地方变得复杂。放LightProbe很麻烦,所以没有梨就感觉很好。
但是,如果建筑物的阴影落在角色中,或者角色可以进入深处,或者舞台上有许多篝火和路灯,并且角色可以接近它,这样的故事,取决于位置很遗憾没有任何元素可以改变亮度。
在这种情况下,我准备了一个脚本来放置LightProbe以便进行初始放置。
您可以从编辑器脚本LightProbePlacer.cs执行此操作,只需定期放置LightProbes。事实上,必须注意将光线放置在光线快速变化的地方,以及不太稀疏的地方,但如果你最终进行手动调节,则不必这样做。即使我把它弄得一团糟,我也能理解这种感觉。
虽然还有官方文档,但如果 LightProbe放得太密集,结果会很奇怪。基本原则是“放置的距离大于移动物体的大小”。例如,如果一个人的半径为1米,高度为2米的圆柱体,如果水平距离不大于1米,则会很奇怪。
中间有一个黑球,你知道发生了什么吗?
这个场景中间有一个圆柱体。而且,我碰巧放入Tekito的LightProbes之一被放置在这个圆筒中。因为它在圆柱体内部,所以周围没有光线,它变得完全黑暗。
最接近这个大球体中心坐标的LightProbe是最暗的,它适用于整个球体。那么,这将是一件事。如果你只将它移动1米并将其从圆柱体中取出,它将是这样的。
这就是为什么LightProbe的放置并不容易,因为它与移动物体的大小有关。如在这个例子中,还有必要避免“陷入困境”。
如果你想制作一款能够与巨型怪物作战的游戏,你必须要考虑很多(我会认为LightProbe只适用于不必要的开放空间)。
现在是设置。
由于Medium是基于智能手机的平台的标准,因此保持适当的状态似乎很好。
Hard Shadow Only
它很好。柔化阴影轮廓的过程很重。如果在阴天或室内时阴影很奇怪,那很奇怪,但是你必须要考虑它,但我认为对于那些“停止ShadowMap并将其变成圆形”的大胆手来说更好。另外,当禁用时,它变得相当轻。Close Fit
如果你有下一个项目,它似乎不会那么糟糕。Close Fit
看起来不错。由于根据相机条件尽可能地缩小阴影贴图绘制范围,因此图像质量得到改善。然而,由于轮廓的阴影Gabigabi继续与Jirajira,它如果急动 Stable Fit
,而会变成使它,请小心的质量和负载。如果增加阴影分辨率以补偿分辨率不足,则会增加内存和GPU负载。虽然很粗糙,但我测量了一下。这是KYOCERA S2(手机)的全分辨率1280x720的测量。当我们准备毫秒和fps时,请看一个曾经使用过的人。
设定 | 帧时间(ms) | 每秒帧数(fps) |
静态烘培+ShadowMap无效 | 21 | 47 |
静态烘培+subtractive LightProbe / ReflectionProbe无效 |
26 | 38 |
静态烘培+subtractive |
25 | 40 |
静态烘培+ shadowmask |
29 | 34 |
静态烘培+ shadowmask + RealTime GI |
39 | 25 |
不使用 static |
31 | 32 |
我能够确认shadowMask和RealTimeGI很慢。此外,还已经证实,如果它没有被烘培而且不是Static的那么它很重。我禁用LightProbe和ReflectionProbe的GameObject的原因他们并不快,可能是因为环境光的处理与LightProbe和ReflectionProbe的处理过程相同。我认为即使您禁用LightProbe,环境光数据也会被吸收并执行相同的计算。
另外,我说是因为我在这个过程中拍了一下。
上图: 按顺序,Subtractive,Shadowmask,不使用Static,Subtractive无阴影。
使用Shadowmask,它真的很好,因为没有“阴影中的阴影”问题。此外,地面是完全明亮的,因为它通过直接光镜面反射计算而变亮。因为这个数量很重,你会感到困扰。
如果删除所有Static标志,则绿色和红色墙壁的效果将完全未知。而且它不轻。但所有阴影都清晰而一致。还有一些产品是可取的。但是,处理非常繁重。
如果你摆脱了阴影,它将会非常快。如果你制作Marugaki,游戏将以几乎这样的速度移动。
然而,它仍然没有达到60 fps,并且事实证明,只要使用标准着色器 Standard Shader,就不可能在此分辨率下产生60 fps。如果你想让它变得如此轻盈,不要把它变成3D游戏,不要计算光照,甚至“自己编写所有着色器”。
但是,在实践中,您应该降低分辨率。1280x720太耗了。如果使用高级方法降低分辨率,整体质量可能会更好。
我打算轻松写,但它又变得更长了。
很高兴能够使用Unity通过一个开关激活最新技术,但最新技术很重要。也许Unity的主要目标是PC,所以看起来如果你关心智能手机,特别是低性能型号,你需要相应地理解和配置内容。
费尽心思2010年代技术的后半段是在堆积,绕过设置下降到了2000年代中期做级别,看上去很不开心。有迹象表明LWRP将成为标准,但我认为如果它是LWRP,我的智能手机将比这个比例更严重。
即便如此,如果不能获得60 fps也是一种耻辱。您将受到想要替换每个RenderPipeline的冲动的驱使。我不打算这样做,因为我不太适合它,但如果我这样做,我可能会把它写成一篇文章。