定制化设计一站式临时空间解决方案
高端产品行业领先进口生产线
核心技术装配式移动建筑系统
金年会体育金年会体育金年会体育这篇文章并不打算去讲卡通场景的具体制作方法,那是另一个巨大的话题。网络上也已经有了不少分享内容(基本还是基于PBR体系的材质Mesh生产流程,以及针对风格化物体的特殊设计)。
这篇主要是讲一些和写实渲染不同的,技术方面的的差异化需求,和资产生产关系不大。
因为风格化场景并不依赖物理规则打光,而需要靠主观调色,如果色调映射一开始就选择错了,之后的所有工作都会打水漂,所以要放在最开始说。
而且这点在做场景的时候还看不出来,因为不管色调映射怎么处理颜色,你手动调光也总能调出预想的画面来。
在使用标准ACES的时候,如果亮度调的较低,暗部细节就会严重丢失(图2),而如果调高亮度至能看清暗部细节,亮部细节就会丢失(图3)。
钟离这张图并不明显,但对于一些在脸上画了细节过渡和腮红的角色来讲,亮部丢失细节的问题同样严重。
虽然也确实可以通过手动调整贴图来解决,因为做不到可见即所得,工作量会大幅提升。虽说PBR时代非要手画贴图差不多也是这鸟样……
我们可以换用UE用于模拟旧版ToneMaping的一个兼容性设置,在Post中设置:
这会改变ToneMaping的曲线,让前端的S区域变得平缓,从而缓解暗部和亮部细节丢失的问题。
而由于RRT/ODT过程导致的偏色,高亮度的脸部依然会偏白,这是这个兼容做法还没解决的问题,但终究比之前强多了。
此外,我们当然还有关闭ACES换用其他ToneMaping方案这样一个选择。但ACES在表现亮度高于1的高亮度区域是有很有优势的,可以显著增强特效的光感,而这正是ACES“高亮度偏白”的功效。
如果有这方面的需求,ACES就必须使用。但使用了,人物的亮部就会错误地偏白。
所以,重新定制ACES的RRT/ODT的流程就是一个需要做的事情。我们希望亮度低于1的区域不要偏色,但高于1的区域则允许偏色,这并不是一个矛盾的需求。
其中一个方案是:可以考虑在无偏色的原始颜色和偏色后的颜色根据亮度做一个插值,保证小于1的区域是无偏色的,然后渐渐过渡到需要偏色的区域。
做法是在图2的基础上对人物纹理的颜色输出做以下处理(处理强度可以通过和原颜色lerp来控制)
其实这个公式相当于预处理了一次纹理,将纹理的高光和暗部区域拉长了,这样就不怕明暗细节被ACES破坏了。
总之,场景由于可以通过调整光照来避免亮部和暗部细节丢失,对色调映射的依赖并不严重。但人物由于使用的是二值化光照,细节被迫需要用同一亮度下的纯纹理来表现,就不得不设法减弱色调映射导致的细节丢失。
这其实是一个人物独有的问题,可目前人物和场景很难剥离处理,所以场景也不得不在最开始就开始考虑。
上面的色调映射调整方案,其实牺牲了场景的效果。曲线调平虽然能保暗部细节,但会导致对比无法拉开。而如果使用原来的S曲线,是可以通过动态曝光来平衡“高对比”和“保暗部细节”两者的矛盾的。
当然你要不开自动曝光,也没有动态光照……我个人也觉得拉平可能也没啥所谓吧,也就是光照比较平罢了,现在的“手游”不都这样。
但理想的方案还是继续优化第二种改人物贴图颜色的方案,因为它并不限制场景,是更泛用的做法。
都不需要专门找个卡通渲染的游戏,只要不是追求“和现实一样”的游戏,都很容易看到这样的现象。
暗部染色最大的作用,其实是通过“色相对比”取代了部分“亮度对比”的功能,从而在保留暗部细节的同时保证了足够的画面对比。高饱和产生的美观倒是其次。
前者,可以给光源加一个阴影颜色属性,在DoL0和ShadowMap遮挡时生效,不通过天光而是通过主光源的背侧打光产生染色效果,这样两边就不会串色了。这个方案不需要额外GBuffer,在延迟光照体系下依然可用。
后者,就只能给物体一个额外的“天光/背光生效强度”“暗部颜色”之类的选项,让不同物体在暗部呈现不同色彩。这在延迟体系下需要额外的GBuffer,会比较伤。妥协的方法是像蓝色协议那样,暗部颜色根据深度在两个颜色中插值,这样至少能避免暗部颜色完全相同的后果。
就是上图这样的东西。Unity在HDRP里竟然提供了这个功能,生造了个词叫Penumbra Tint,也是满符合Unity自己的人设的。
我是当初研究新海诚动画的画面特征的时候发现的这个东西。这个元素,也是大部分模仿新海诚风格渲染作品所缺失的最后一步。
我起初也觉得这个元素是个见缝插针加饱和度的“艺术设计”,直到我在实景中看到了这个现象(拍的不好,肉眼看更明显)
总之,从结果上来看,人眼似乎是可以接受这种“在明暗交界处饱和度提升甚至换个颜色”的表现的。所以作为风格化作品,强化这个表现也就一点问题都没有。
这个元素比较类似次表面材质的效果,所以也可以用类似(差不多是完全一样)的方式来实现。分为两部分:
投影部分在软阴影部分叠个额外颜色就好了,次表面就是这么做的,区别就是UE的实现里,亮部也同样需要叠加颜色。
而非投影部分的次表面特性有两个实现。一个是预积分LUT,相比普通Ramp还需要用曲率修正LUT UV的V坐标,否则半影部分在缓慢曲率上会过宽。另一个就是基于屏幕空间卷积的SSS,可以很完美的实现这个效果。
或者也可以是上图这样的情景:虽然整体光照都是橙色,但是亮面一侧由于亮度过高导致了泛白,半影部分恰好卡在了不会泛白的亮度区域,保留了原色,最终形成了这个视觉效果。
总之,这两个视觉效果如果用物理打光实现,出现条件较为苛刻。所以在技术实现上,要提供“脱离亮度限制,硬把这个效果挖出来”的功能。其颜色和强度应该由光源和材质双方决定。
如果不希望增加延迟光照下GBuffer的数量,也可以完全由光照决定半影颜色和强度,仅通过材质蒙版来过滤不希望出现这个效果的物体。这个效果也可以仅通过增加半影处饱和度来实现,这样不依赖GBuffer也可以让不同物体的半影颜色互不相同。
原神人物上的Ramp其实也是基于这个现象的产物。对于缺乏细节的二值化光照,这是一个很好的补充细节。
GI是表达真实感很重要的一个要素,只要把GI做对,画面就会显得真实。换言之,只要GI是对的,不管怎么做看着都会像照片——而这是风格化渲染需要重点避免的地方。
一个方案是干脆去掉GI,手动补光,退化回PBR之前的模式,典型的例子就是原神。缺点自然是光照平,且单调。但是正因为单调,控制起来也容易,每个地方的颜色都可以单独处理。
另一个方案是反过来加强GI,这同样也能达到“不真实”的目的,色彩区域的融合也可以让多个物件浑然一体。缺点就是控制起来比较困难,只能做成啥样就啥样。
日式卡通风格是从纸上作画转移过来的,自然平涂色块会比较多(毕竟人手绘制GI难度较高),所以风格比较接近无GI的效果。如果想符合日系风格,GI就是一个需要压低的元素。
比如下图的情况,如果放任GI的染色效果,这么大片的绿色草地必然会影响到房子墙壁的颜色,无法保持这么高的色彩对比差异。
而欧美的风格化作品并不是基于某个现有画面风格创造的,较为自由,不管结果是什么好看就成,所以有不少调高GI的作品,毕竟这种做法简单高效。(但色彩对比较弱也是问题)
风格化渲染,金属部分和写实渲染在高光GI方面的需求基本一致,只是对IBL的形状和清晰化要求更高,所以有一种选择是直接使用MatCap,放弃和光源的相关性而优先保证光斑形状。
非金属部分其实同样也需要高光,只是高低频部分会拆分的更开,或者是平缓的大面积微弱高光,或者就是狭窄的小面积强烈高光(通常在曲率变化剧烈的倒角)。而这些在传统PBR体系下都能实现,就不说了。
但因为NPR体系下的颜色经过了各种特殊指定,并不和实际现实亮度直接对应,很容易出现纯白区域不希望Bloom,而高饱和低亮度区域反而希望Bloom的情况。
其次,Bloom同时也是一种画面上的低频信息,为了营造一种柔和的画面“氛围”,我们也希望增加这种低频信息的比例。而强行拉高整体Bloom强度又会导致高亮度区域过曝。
所以我们需要一个自定义的Bloom缩放系数。因为从崩三开始的游戏都实装了这个特性,是否要实现它一般并不会有疑问。
具体实现的时候,最佳方案其实是准备一个单独的Half通道以储存一个HDR范围的亮度值,并在frag中将原始颜色的亮度值计算出并存入。只有这样,才能保证Alpha Blend, Additive,以及各种特殊混合模式下的Bloom值的正确性。
通常,我们并不愿意花费一个16bit的通道来实现这个效果,只愿意使用一个8bit的通道,所以只会储存一个Bloom的缩放值。这样在透明混合的时候就会出现各种麻烦。
放弃透明物体的Bloom值自定义功能,透明物体阶段并不写入Bloom值,这样也节约了带宽。
而为了最终计算Bloom结果正确,必须将透明物体和不透明物体分别渲染,然后在Bloom阶段重新组合。(为什么必须这样解释起来很麻烦,信我就行了)
这个分离透明物体渲染的功能UE本来就提供了,只需要修改Bloom部分的RT组合,实现还是很简单的。而且通过配置r.SeparateTranslucencyScreenPercentage还可以获得半透物体降分辨率功能,还可以根据帧率自动进行,基本上不会不开,分离渲染导致的性能代价也就无所谓了。
(原神的透明物体分辨率过低的问题确实严重。我觉得可以将部分需要精度的透明材质转为Mask材质来解决问题,Mask通过TAA抖动模拟单层半透的效果还是不错的)
虽然Flare,Bloom,Volume Light从物理角度是不同的光学现象,但它们都是画面的低频信息提供方,也可以近似处理。
风格化渲染实际上非常需要这类低频信息增强画面的柔和感,以及缓解纯色块的单调感。除了Bloom,Flare和体积光同样也是实现这一点的很好用的工具。
严格来讲,最理想的方案其实是执行两次Bloom,一次无视物理亮度给画面整体做一次模糊叠加,第二次根据亮度做正常Bloom模拟实际的辉光物理现象。但因为Bloom的性能成本较高,当然希望一次做完。
配置Bloom参数的时候要考虑倒这一点。两个Bloom的功能其实是不同的。
投影或者保持边缘清晰,或者保持一个大范围的模糊过渡,而不要在两种模式之间暧昧不清。
同时,需要表达一个简单清晰的形状。清晰边缘不要有尖锐的锯齿,模糊边缘的透明过渡不要有坑坑洼洼的锯齿转角。
同时,投影的强度依然不要暧昧不清。或者是清晰可见的,或者就直接没有,这样才能避免脏污感。
人物通常都需要清晰的投影边线,避免和二值化的画面元素冲突。而人物的装饰尖角又是常见元素,投影面多为弧面,这导致投影在不同方向下非常容易出现下面的凌乱边缘。
利用距离场简化投影形状是比较直接的解决方案,但性能较差。目前比较靠谱的是手动隐藏部分难看的投影,或者使用代理投影物体。
人物的问题放下不谈。场景中,因为投影面多为平面,锯齿类问题并不严重,但距离终极目标依然非常遥远。
观察这两张图可以看到,仅通过ShadowMap产生的投影其实是很难做出预期的投影效果的,因为你要的效果根本不符合物理规则。
基本上,风格化投影是个没有被解决的问题。现在要不就选择写实的风格,这样起码不难看,但就是距离理想效果差那么一截。要不就要限制投影的出现,如果场景里只有直线光有投影(并且根据需要屏蔽掉一些投影物体),即使是锐利边缘也不容易出现杂乱的感觉,其他的影通过烘培/手绘尽量搞成低精度的软边,大概也能做出图1的效果。
也就是需要表达物体相对位置关系的地方,投出锐利的直线光投影。而剩下的影的部分则用范围很大的“AO”感觉的软投影表现,这样锐利投影的冲突就不明显。
因此我们需要一个可以规定位置的“AO”生成手段。虽然是用AO的方法实现的,但其实是影。这个下面会讲。
这里我顺便谈个Local光投影的问题。一般Local光是不产生实时投影的,一方面是性能问题,一方面上面也说了,多个可投影光照很容易导致投影杂乱。
但如果直接关掉Local光的投影,Local光很容易把直线光的投影给直接盖住,形成无影灯的效果,这样人物就变得没有投影了,容易形成悬空感。
Relink让这些Local光直接应用直线光的投影范围,解决了这个问题。维和感并不严重,是一个挺有想法的解决方案。
上面说过了,现在我们要的不光是AO,它同时也包含了Local光投影的部分。
典型的例子就是草。草虽然可以加个Mask避免自己身上出现AO,却无法阻止自己的AO投到地面上,又不能不写深度。这样会导致地面一片脏污。
所以,我们需要修改原始SSAO,让它能够自定义不同物体产生的AO强度,但具体如何定义呢?
性能比较好的方法是:给场景创建一个专门用于AO的“框架”模型,只在墙角和柜子后面需要AO的地方单独建模,并输出到额外RT。
然后在执行SSAO的时候,不从场景深度,而是直接从这张RT里采样周围深度,这样就能实现对AO物体的过滤处理。
它柜子后面看着像Local投影的固定阴影也是用AO实现的,关掉SSAO特效就没了。
人眼需要获得足够的信息来分辨出物体的3D形状,从而正确识别这个世界。现实世界中,我们其实是靠物体不同面的光照亮度差异来识别的。不同物体交界处必然有亮度的陡峭变化,而通过亮度的连续变化也可以感知到弧面的具体形状。
然而,色块化风格里,一没有AO,二值化的光照也会导致不同面的亮度差异消失。
如果没有描边,就会觉得物体被压成了薄薄的一层。除非刻意调整颜色,不谈美丑,画面信息识别起来都是个问题。
而现在的游戏场景很少做真正的色块化处理。不仅不会用二值化的光照,往往也会保留AO,所以,当然不需要加描边。
但风格化场景为了让画面显得干净,确实可能会向着稍微色块化一些的方向前进。那么加入一些描边元素就是有意义的了。而且就算已经足够识别了,加些描边让物体边缘更加清晰也不是坏事。
但描边这种东西并不是加了就一定好的。如果整个画面的描边都是同粗细且不分层次,反而可能让不同物体混在一起,让可识别性降低。描线是需要虚实变化的,同色的描边还会冲谈原本的色彩对比。
而这就需要自定义描线的粗细和颜色,还要合理处理粗细变化。目前实现起来是比较困难的。
而实际情况下,我们的场景往往并不是纯色块化的风格。所以也不一定需要描线,只要能稍微强化下边缘就可以了。
实现方式就是在绘制的时候根据光照偏移一些位置采样深度,对比深度差决定是否变亮。用后处理或者frag内直接做都是可以的。
相比常见的“菲涅尔”边缘光,它能保证边缘足够细,能更好的承担“勾边”的功能。
描线元素显然是不能缩放的。一旦放大了,它就不再是描线,而是某种粗色块。而缩小了,小于屏幕单个像素,则会消失不见。所以会做成尽量不随距离变化。
而这个描线可不光是外描边或者边缘光什么的。卡通风格的贴图里,其实很多元素本质都是一种边缘信息。
而游戏里,常见的情况是后者。你在前者的大小下画多好都没意义,缩小了效果其实很差。
所以,和插画不同,游戏模型一般会要求人物使用尽量简单的设计(而不是像插画那样要求尽量多的细节),因为人物在游戏里往往是没有立绘插画那么大的。这样缩小后才能看到基本的边缘细节,而不是让细节全部糊掉。
如果个俯视角或者2D视角那还好,因为允许的缩放范围有限。自由视角基本就完蛋了。
确实,我们可以不把描线画贴图里,而是用各种描边算法实时生成,保证粗细不变。但拉近后还是存在问题。远处小物体当然不能有描边,但拉近后小物体的描边又应该显示出来,因为它已经变成了“大物体”。
一个无脑的做法是,只有距离足够远的物体才显示描边元素,近处就直接显示没有描边的裸PBR效果。虽然不是想要的效果,相比之下还算一个可以接受的方案。
总有人想靠“水彩”“油画”“蜡笔”创造特殊的风格化效果。玩家想要“和画一样”的体验,那就将画面做得和画一样。
笔触化后处理不是不能用,而是不能直接照着现实中的画那样去用,应该把它当作一种创造画面的手段,而不是实现目标,因为目标效果动起来并不一定好。
这块涉足的较少。但擅加利用的话,或者能找到突破画质瓶颈/差异化的突破点。
之前蓝色协议分享那篇文章,我说不知道他们嘴里的“パラ(Para)”是什么意思,这篇文章正好也说到了,其实就是个屏幕上的叠黑渐变。
返回