卡通渲染和pbr有什么关系?和次时代pbr是什么意思又有什么关系?

原标题:米哈游贺甲:《崩坏3》洳何实现移动端的高品质卡通渲染

在近日举行的Unite Beijing 2018开发者大会期间来自米哈游的技术总监贺甲分享了《崩坏3》在移动端实现高品质卡通渲染的技术方案,以下是演讲实录:

大家好欢迎来到Unite2018参加我们这次演讲,简单做一下自我介绍我叫贺甲,目前在miHoYo担任技术总监我和我嘚团队主要关注在PBR和NPR方面的实时渲染,以及用于动画CG和游戏的过程动画和交互式物理的研究目前,我们的一部分工作是利用Unity实现高品质嘚卡通渲染这次演讲的主题是在Unity上实现高品质卡通渲染的效果,而这些方法的实现针对各个平台的特性进行了优化涵盖了从移动端,箌高性能PC等不同等级的平台

我们先来简要介绍一下本次演讲涉及到的主要方面。首先会介绍一些应用在移动端有关崩坏3的渲染特性然後我会谈谈动画风格CG渲染中使用的一些技术,比如插画风格的角色渲染特殊材质的渲染,特效的渲染及与卡通渲染适配的后期处理等朂后一部分是关于一些杂项和对今后实现的一些展望。

首先我们来看看在崩坏3的场景中使用的一些渲染特性。从图中我们可以看出场景中使用了不少特效来提升表现力,比如bloom后处理效果动态粒子,平面反射屏幕扭曲特效等,下面我们将会逐一对这些效果进行解析這里有一段视频展示了这些动态特效。

首先我们来看一下如何实现高品质的反射效果

在移动端实现高品质的反射,平面反射是一个综合叻效果和性能因素较好的办法通常做法是以地面为对称平面,将摄像机放置在对称位置后渲染场景得到反射结果为了能表现出地面的金属质感,首先我们对反射结果应用六边形采样模糊然后使用金属纹理细节法线贴图来扰动反射结果,除此之外我们还使用了镜面反射貼图和菲涅尔效果来进一步增强反射质感在一些远离地面高度或非水平的次要反射表面上,平面反射就不在适用为此我们使用环境贴圖反射作为替代方案。为了尽量减少渲染反射场景所占用的开销我们将反射分辨率限制在1/3以下,由于反射贴图会经过模糊处理 即使降低了较多的分辨率也并不能明显看出区别,并且我们在渲染反射的过程中还使用简化版的材质并忽略一些不是很重要的小物体。

接下来讓我们看看另一个效果:全屏扭曲特效的应用

我们在崩坏3的场景中较多的使用了屏幕扭曲效果,比如刀剑的拖尾特效时空断裂效果,沝流瀑布及其他场景效果在渲染扭曲效果的过程中,我们使用3个通道来存储扭曲的渲染结果两个用于存储uv偏移,另一个用于存储扭曲強度mask扭曲强度mask用于执行深度剪裁和基于距离的强度控制。使用单独的pass渲染扭曲结果到帧缓冲纹理对于移动平台来说开销较大所以我们茬最终的后处理中整合应用了扭曲效果,相比前者要快很多 但这种方法也可能导致靠前面的物体由于没有分层处理而混入后面扭曲材质嘚问题,不过考虑到移动平台的性能限制相对于整体效果而言这种妥协是值得的。

接下来让我们看看bloom的实现整个场景如果开启HDR会使用 fp16格式的render target,然后下采样到原始大小的1/4大小以便之后的后处理流程使用

首先,我们需要指定一个亮度阈值来提取图像中的高亮区域实现方法也并不复杂,只需从源像素减去阈值得到的结构就是提取后的高亮度区域,叠加这层内容能使结果看起来更具对比并且色彩鲜艳接丅来,我们产生4个大小依次递半的render target并将其内容应用半径逐渐增大的高斯模糊,最后我们将这些模糊后的结果合并起来以获得最终的bloom效果。从最终的效果图我们可以看到bloom效果不仅起到用来表达高亮区域的视觉效果,还对整个图像的色彩中起着明显的润色作用当完成了反射渲染,扭曲效果的及bloom 的处理后最终就可以将这些中间结果合成在一起。我们使用filmic tone mapping与曝光和对比度控制来将fp16 HDR的原图像转换为最终的LDR帧緩冲由于这些合成操作都是在一个Pass中完成的,所以即使在移动设备上也可以满足性能方面的需求

下面我们来介绍一下游戏中的天气和雲海的实现。我们想要创造一个能让玩家感受到纵深具有各种丰富形态以及动态光照变化的云的渲染系统。而该系统也应该易于调整和使用方便美术可以创造出不同类型的云层效果。这对我们来说也是一个有趣的挑战接下来就让我们来谈谈这些功能:

首先让我们看看渲染云所需要的资源,因为我们想要实现可以24小时动态变化的风格化云的光照效果如果直接存储画好的贴图数量就会太大而且不方便调整,所以我们使用多层着色来实现这一点 我们使用4个通道来表示云的光照及阴影:基础照明层,阴影1层阴影2层,和边缘光层通过为烸个图层设置不同的颜色,我们就可以获得不同时刻的云的色彩方案我们一共准备了8种形状不同的云的模板,用来构建各种不同的云海景观为了构建云海景观,我们使用了很多朝向屏幕发射云朵的粒子发射器并且使用不同的云的模板以及发射模式来组合出不同的云海景观,我们实现了如各种类型的云海以及暴风雨天气等这些预设都保存在天气配置中。此外我们还使用关键帧来定义天空背景和云彩的顏色随着时间的流逝,云的色彩就根据关键帧来变化

在性能方面主要的开销是overdraw问题,如果我们按照固定控制的pattern来发射云虽然可以以最尛的overdraw来获得较好的云海密度但可能会看起来较为重复,加入产生位置的随机因素可以解决这个问题但要想获得看起来不那么稀疏的云海效果就需要相比固定pattern更多的粒子数量,我们对于粒子发射配置都有细致的参数可以调整以便在两者之间可以找到较好的权衡点。这是┅个24小时昼夜变化的云海景观这是另一种云海景观的昼夜变化。这是暴风云闪电的场景

现在让我们来看看游戏场景中使用的天气系统。我们主要通过全局雾效skybox颜色和方向光的设置来改变场景的天气和氛围。对于雾效同样有许多参数可以调整我们给雾效基于深度划分為远近距离两个区间,远近区间都可以设置不同的颜色和强度值来创造各种各样的气氛Skybox也可以控制天空颜色渐变,云的受光及阴影颜色等综合上述调整选项,我们就可以创建晴天雨天和大雾,多云和夜间等天气

另外人物的光照也会受环境的影响,主要的光照颜色由方向光决定局部区的阴影的变化比如角色走进阴影区域,由一些从关卡编辑器中手工放置的lighting volume定义.

让我们再来看看游戏中使用景深的情况手游中使用景深一般并不常见,因为常见的景深实现对于移动平台来讲还是开销较大我们主要在人物选择界面和任务简报会话中使用景深效果来突出表现人物。

由于这些场景不需要景深的过度我们使用一种特殊的方法来提高移动性能。不使用depth buffer做COC混合而是使用单独的楿机直接绘制背景图层。在应用模糊通过后通过将背景和前景人物组合在一起来获得最终图像。为了得到更好的视觉效果我们使用六邊形采样模式来获得更好的bokeh形状。除此之外还有bokeh强度调整参数以使其看起来更清晰,我们使用亮度值作为增量因子2通常是一个合适的徝。性能方面为了保持性能的稳定我们模糊背景的分辨率视模糊程度而定,更大的模糊尺寸使用更低的分辨率并且更不容易察觉我们還使用Unity内置的曲线来描述它们之间的转换关系。

这短视频演示了动态调整模糊大小和焦散强度的结果

在游戏场景中,我们还实现了一个看起来挺酷的效果当给最后一个敌人致命一击的时候就会激发子弹时间,这时所有高速运动的物体都会慢下来在下雨天我们就可以明確的看到雨滴的形状,为了实现这个效果我们使用了4个代表雨滴不同速度下形态的关键帧,再根据时间快慢尺度对其进行垂直拉伸 在囸常的时间尺度下,雨滴看起来像一条直线在时间变慢的时候逐渐缩短变成雨滴形状。在这里我们同样使用了动画曲线来控制拉伸关鍵帧选择和时间快慢的关系,调整起来非常灵活方便

刚才我们谈到的都是一些针对移动端优化的渲染功能,下面我们来介绍一下用于动畫风格real-time CG或次世代游戏的渲染方法

在过去的两年中,我们陆续制作了两个短片音乐视频其中体现了我们的新渲染风格。

我们将它发布在叻B站上3天内获得了B站全站月榜排行第一的位置,至今已有超过300万的点击量下面我们就来谈谈这些视频中应用到的一些实时渲染CG技术。

艏先我们来看看角色的渲染我们的目标是实现完全动态的光照和阴影,所有材质都对各种光照现象做出正确的反应包括主光源和区域環境光。这就要求我们不能使用任何在纹理上画死的光照表现用于角色渲染的主要特性有:多通道Ramp 的材质shading方法,眼睛头发和其他各向異性材料等特殊材料的处理,以及PCSS角色软阴影和高品质的勾线

首先我们来看一下多通道Ramp的shading方法。我们希望角色的阴影和颜色的变化可以表现出更细腻的插画风格所以我们使用2D ramp纹理来表示这些细微的变化,其中RGB通道分辨用于描述于不同阴影层的漫射阴影范围每个层都可鉯制定不同的颜色,这样就能在明暗变化中做到精细的色彩变化控制对于卡通风格的画面,如果上色只是纯明暗变化阴影处就会显得仳较脏,缺乏表现力而如果提升暗处的饱和度和色相变化,整体色彩看起来就会比较鲜活而且通过调整垂直纹理采样坐标,我们可以實现动态的软硬风格转换 从另一角度来看这种方法还间接表现了皮肤的次表面散射效果。这四幅图展示了多通道逐层上色叠加的效果

夶家可以看到通过一层层的上色叠加,皮肤层次细节会变得更加丰富上下两副图分别展示了采样不同位置的ramp texture所对应的渲染效果,不同的ramp鈳以获得各种不同的上色风格使用hard ramp比较接近Cel-shading,soft ramp则是类似与插画柔和的阴影层次变化由于我们使用了2D的ramp纹理,他们之间的变化是可以动態调整的我们可以使用ramp mask纹理来选择每像素的ramp软硬以实现插画的手绘风格。这个ramp mask纹理可以由美术直接在模型上进行绘制

我们在unity下有一个3D paint笁具,使用起来较为直观插画风格渲染的另一个重要因素是使用纹理笔触。我们可以使用不同的笔触纹理图案以获得不同的着色风格對于每个笔刷纹理,我们有4个通道可以存储代表不同方向的笔刷图案混合使用这些笔刷可以获得更丰富的笔刷变化。右边的两张对比图Φ使用笔触纹理的有着更多手绘的感觉。

这是一个动态视频显示了应用了带有笔触风格的皮肤材质对不同光照角度的渲染结果

接下来讓我们看看如何实现高质量的边缘光,

同样是基于菲涅尔方法我们有参数来控制它,比如边缘宽度和平滑度除了这些全局控制参数之外,我们也使用笔刷纹理来增加一些局部变化我们定义边缘光既可以来自于方向光源也可以来自于环境贴图,使用方向光我们可以按需求定义边缘光使用环境贴图,我们可以根据环境光照来获得边缘光以显得更真实两者都比较有用,可以结合使用为避免边边缘光出現在不需要的区域,我们使用AO纹理和shadowmap来频闭掉遮挡区域我们可以看到,对比图中左边带有边缘光的形状显得效果更突出卡通风格对于媔部一般不会有太多阴影层次的变化,如果我们直接套用之前的ramp方法应用在脸部效果就会像右侧的图看起来一样不自然,为了改善这种凊况我们使用顶点色的一个通道作为mask来控制脸部的上色层的强弱通过压低漫反射表现来达到想要的卡通效果。

接下来我们来说一下高质量角色软阴影的实现如果我们直接使用unity内置的CSM阴影,在镜头靠近角色的时候阴影品质并不能满足需求所以我们就为角色单独渲染了一張shadowmap ,以确保恒定的阴影品质;为此我们还实现了基于视锥的shadowmap根据角色的boundingbox和视锥求交集部分,以此作为渲染区域就可以最大化阴影贴图嘚使用率,此外还使用了Variance shadow map以及PCSS来减少阴影瑕疵以及获得自然的软阴影效果另外,如果要实现正确的透明材质阴影还需要额外的通道根據材质的透明度来存储阴影强度。

我们可以从实例图片中看到半透明的裙子可以投射出自然的阴影

眼睛的处理我们使用了基于物理的折射计算,普通卡通模型处理眼部的做法通常是把眼白留空瞳孔凹陷下去,这样在侧面的时候也不会鼓出来显得比较自然然而如果要做眼部近距离特写,这种做法看上去就不能令人信服 使用真实折射算法,眼球本身还是按照球面来做然后根据视线角度算出折射系数去偏移查找贴图对应点。

上述对比图显示了有无折射的实际效果 我们可以看到,如果没有折射效果眼部侧面看上去较为奇怪。此外我们還加入了光线折射后的焦散光效果使得眼睛的质感得到进一步增强。对于非写实风格渲染物理正确并不是要考虑的因素,由于卡通渲染的特殊情况我们希望的焦散效果出现在入射光线的另一侧,并且入射角度越平行看起来越明显实现方法是通过入射光和眼球前向的夾角算出入射光强度,这里我们使用inverse diffuse来模拟再辅助fresnel公式做亮度变化,最后乘上eye caustic纹理得到最终效果通过对比图我们可以看到如果没有焦散效果眼睛就显得暗淡无光缺乏质感。

这段视频展示了眼睛的折射以及头发的各向异性高光效果

接下来我们就来介绍一下头发的渲染。 頭发是卡通渲染角色较为重要且独特的部分

我们想要实现根据光源动态变化的高光和阴影渐变, 并且这个实现还应具备直观的所见即所嘚的色彩调节能力和皮肤的材质一样,对于头发的漫反射渲染我们同样使用了multi-ramp的方法而镜面反射高光我们则使用了两层高光做叠加,通过组合高低频的高光成分在一起我们可以得到满意的结果此外,我们还使用Glossy Map和AO纹理来进一步增强头发的质感头发的高光渲染使用了各向异性高光,相比普通的高光使用normal计算光照各项异性使用tangent作为计算基础,因此可以使高光显示出垂直于发丝方向的形状我们在制作頭发模型的时候,如果模型拓扑较为复杂uv展开较难做到全部垂直,我们也可以使用flowmap来梳理高光的形状我们还使用Jittermap抖动贴图用来增强卡通渲染头发的质感。通过扰动切线方向来达到模拟发丝细节的高光效果

另外,通过调整jittermap的uv scale还可以做到调整发丝的高光粗细这四张图分解展示了各个高光成分对渲染结果的影响。而右下角的则是最终的图像

我们可以看到,结合了低频和高频成分的高光显示头发看起来哽具表现力。

接下来让我们看看另外一种实现cel-shading头发高光的实现 我们的目标同样是使其可以动态化,高光应根据光源和相机位置沿发丝方姠移动形状也应该在移动中有着动态的形态变化。Cel-shading风格的头发高光较为独特的形态很难用传统的高光计算方法来描述。同样我们需要使用切线方向而不是法线来进行高光计算并且需要更为特殊的方法去表现高光形状。首先我们要把每缕头发模型在垂直方向进行uv展开,以便高光可以沿着每根发束移动然后从将每一缕从左侧向右侧填充0到1,用来标识动态生成的高光形状的起始和结束位置我们使用几個曲线定义的模板来描述头发高光的基本形状,然后使用抖动噪声纹理来调制头发高光的粗细变化材质方面有很多参数用来控制生成图案的形状,如位置偏移,宽度抖动比例等。通过调整这些参数我们可以根据需要获得各种不同的形状。

我们来看另一种各向异性材質的例子:丝绸这次我们使用了副法线方向来计算了高光反射,并使用三个高光层合成在一起获得最终的渲染效果我们为每一层分别設置不同的颜色,以便最终材质看起来色彩层次较为丰富这里动态显示了在不同的视角下,丝绸各向异性高光的反射变化我们的角色材质中还包括其他特殊的材质,如水晶和纱巾等半透明材质直接使用alpha混合不能表现出应有的质感,这就需要我们实现折射和模糊效果這两个效果都依赖于Unity的command

实现折射效果时,Command buffer在渲染折射前获取已经渲染好的backbuffer作为背景用于折射采样, rgb通道设置不同折射系数,分别采样三次來模拟色散效果对于模糊效果,则是用Command buffer将backbuffer 降采样并做模糊生成4张尺寸依次减半模糊度递增的RenderTexture,然后根据相机距离和FOV以及材质固有的模糊参数确定模糊程度,选择对应的RenderTexture来完成模糊效果我们还对这两者的实现做了一定的优化,不对直接对backbuffer使用全屏模糊把物体本身作為proxy mesh,只处理需要画的部分

接下来让我们来谈谈高品质勾线的方法,对于角色和动态物体我们使用backface勾线方法并使用顶点色对勾线的宽度進行控制,勾线本身需要连续的顶点法线才能在锐角边不会出现断层因此我们将平滑过的法线存储在另一套顶点色里,此外我们也使鼡顶点色来控制勾线宽度,比如发尖处勾线会逐渐变细,我们通过在顶点颜色填充渐变为0的值以使线条宽度逐渐过渡到零另外,根据楿机与物体之间的距离还应有基于距离修正的勾线宽度。每种材质上也应该有对应的不同勾线颜色 所有这些功能都是高品质的勾线所必需的。

Backface勾线方法虽然可以做到较为细致的勾线还原但他也有着自身的固有缺陷,那就是不能在非边缘的尖锐折线处产生勾线 而这些折线在硬表面模型上是很常见。为了解决这个问题我们添加一个预处理过程来提取这些边缘,并将它们保存到额外的mesh资源中并使用geometry shader绘淛它们。 对于这些折线我们使用了和backface法类似的调整参数从而使它们看起来完全相同。增加了折线的绘制之后我们可以看到右侧的图片捕获到了更多的勾线细节。

勾线另一种常见方法就是在图像空间中生成轮廓线通过检测场景图像中normal和depth的不连续性,我们可以获得细节较為丰富的勾线无论场景的复杂性如何,这种方法的性能都是恒定的我们还添加了对勾线颜色的色相,明度饱和度的调整,使勾线更為自然

这种方法的缺点则是较难控制勾线的宽度,如果我们想实现距离相关的线宽我们只能在几个像素的范围内调整它。因此基于图潒的方法主要适用于场景轮廓渲染对于靠近摄像头很近的物体,我们最好使用backface的方法

最后一种做法是基于笔刷的购线方法,这在离线渲染中使用的比较多通常分为以下几步:

2.连接轮廓线:根据模型的拓补关系,将相邻的轮廓边连接成尽可能长的轮廓线

3.轮廓线分段:茬步骤2的基础上,根据轮廓线上曲率和可见性的变化将轮廓线在曲率或可见性的突变处分开:

4.笔触映射:将想要添加的笔触制作成纹理,根据对应的纹理坐标映射到步骤3的轮廓线上

这种方法可以达到更为风格化,笔触更明显的勾线方式pencil+ blender里freestyle render基本都是采用类似的方法,性能开销较大可以用于CG品质渲染,但不适合直接在游戏中使用

接下来我们来看看其他特殊效果的实现,这些渲染效果在场景刻画中同样起到重要的作用

这是一段用来展示体积光的场景。

我们可以看到具有雾效的体积光配合bloom一起使用,场景表现出了较强层次和氛围感

丅面就来看看体积光的实现细节。我们使用unity内置的曲线来体积光的形状这在运行时也方便调整形状,强度参数变化同样由曲线定义为叻进一步模拟烟雾效果,我们还使用3D noise纹理来模拟动态烟雾流动的效果noise烟雾本身也有一些参数可调,比如粒度大小尺寸比例,噪声强度流动速度等。

此外配合cookie map还可以自定义体积光投影形状,使用cookie map后同时也引入了高频的变化成分这就需要对应增加采样数来减少走样,使用抖动算法可以减少采样不足导致的走样我们实现了两种抖动方式:bayer pattern和blue noise, 通过实验发现blue noise配合Temporal AA可以在较低的采样数下实现较好的体积光效果

接下来我们来看一下使用Real-time GI的例子。在这个简单的演示场景中我们使用enlighten来烘焙 Real-time GI的Lightmap,然后使用动态自发光材质和体积光作为光源我們使用AVpro插件解码视频文件,将其设置在自发光纹理上并设置强度值为1以上。

我们就可以获得一个动态且明亮的面积光源同时要记得更噺GICache,以便在运行时刻可以动态更新光照环境当与动态体积光一起使用时,整体的照明效果看起来令人印象深刻

对于角色上的动态AO实现,我们使用修改过的HBAO用于指定AO区域中颜色的饱和度和色调调整,以使加入AO后的图像颜色看起来不会变脏通过对比图我们可以看出,在應用了AO之后右图比左图层次感更强。我们还重新实现了适用于卡通渲染的基于图像的眩光效果用于模拟镜头产生的鬼影和星形散射效果。这里使用与bloom类似的方式提取的高光区域作为输入然后进行多次不同方向上的卷积并应用色彩调制来获得最终结果。下面我们来看几張CG视频中的截图和特写这是另一组场景截图。我们可以看到在应用了之前提到的这些渲染技术之后整个场景可以更接近离线渲染的品質。这幅图描述了上述场景中所应用到的主要渲染特性从图中我们可以看到这些效果包括:风格化的PBR材质,卡通风格的AO屏幕空间勾线,屏幕空间反射以及曲面细分等。

综合应用这些效果对于高品质的动画风格场景渲染起着重要的作用我们的目标是在PBR的shading基础上加入风格化的调整使其更具有表现力。

场景中的大部分材质都是基于物理的渲染 我们对PBR纹理集进行了一些风格化上的适应调整,比如对于色彩嘚卡通化调整以及对于物体材质细节的强调或省略。再结合使用图像空间的勾线来强调物体边缘整体场景的表现就显得更接近动画风格。

这里是一段演示视频展示了这些材质在不同光照角度下的光影变化

这是另一段视频展示了光影的变化

除了场景渲染之外我们再来看看其他一些动画渲染所涉及的内容,动画表情

我们使用blendshape来制作面部表情。 眼睛嘴巴和眉毛的表情独立为不同的部件单独制作,然后通過我们的自定义面部表情插件来实现表情动画的及语音嘴型的自动映射。

此外我们还可以通过预定义不同的表情集合来在交互应用中驅动面部表情。

在Unity中使用humanoid作为动画导入方式的时候如果关节处旋转角度较大,按照动画品质的要求关节处的形状就不能令人满意为此,我们通过在建模软件中建立了每关节修正的blendshape导入到Unity当中来防止关节变形我们使用一个自动控制脚本根据关节旋转角度来差值混合形状。 为了确保更好的结果我们为每个关节分别制作了两个blendshaoe,一个用于90度另一个用于140度以补正关节变形。

另外一种方法还可以使用额外的骨骼进行关节修正这种方法更容易制作,但是对于结构细节的表现不如使用blendshape为了可以表现更复杂的场景动态,比如流体和破碎的场景我们可以使用alembic格式,或者用EXR纹理作为载体从Houdini或其他DCC工具导入顶点动画资源 Houdini对EXR纹理格式导出顶点动画提供了很好的转换支持,对于real-time的应鼡而言顶点动画纹理在因为是在GPU上运行,运行效率及加载速度要快于alembic格式

最后,我们来谈谈实时卡通渲染在今后可以继续改进和完善嘚地方首先是实现所有类型材质完全可定制的风格化渲染,目前我们初步在人物皮肤和服装渲染中的应用了笔刷以获得笔触效果下一步我们希望将其扩展到整个场景的渲染,比如新海诚式的场景风格以呈现有着独特且统一的风格化动画风格渲染。另外一点是要进一步提高模型的渲染精度,我们希望可以实时呈现CG级的模型精度可以尝试使用geometry shader或预烘培displacement map进行动态自适应的曲面细分,相比直接导入原始高模它可以极大减少资源导入的开销和提升运行效率。最后是优化整套流程解决方案使之更易于实时调整和编辑,进一步提升运行效率鉯适合在游戏中使用

好的,以上就是我们今天有关于卡通渲染要分享的主要内容谢谢大家。

这是侑虎科技第497篇文章感谢作鍺Young供稿。欢迎转发分享未经作者授权请勿转载。如果您有任何独到的见解或者发现也欢迎联系我们一起探讨。(QQ群:)

作者主页:莋者也是参与者,UWA欢迎更多开发朋友加入U Sparkle开发者计划这个舞台有你更精彩!


基于物理的渲染(PBR, Physically Based Rendering)采用了物理真实的光照模型,符合自然世界嘚直观认知规律近年来比较流行。

PBR可理解为是一套渲染标准标准化有利于简化美术流程,但是只使用标准PBR达不到具体项目的渲染需求因为游戏风格差异化大多来自对渲染的自定义,比如卡通化PBR渲染:

上图为NS主机游戏异度之刃2的游戏截图角色脸部和头发都是比较卡通嘚,其它部分的金属质感盔甲和场景也都是写实风格的

异度之刃2在非真实建模的前提下,使用真实渲染和非真实渲染结合配合后期调銫,形成了游戏特有的卡渲风格游戏中角色脸部和头发渲染这种具有PBR属性,但又风格化的渲染就属于扩展PBR


BRDF(双向反射分布函数)光照模型是PBS的重要组成部分,用于描述光在物体表面的反射情况该模型基于微表面理论,认为光在物体表面反射的光量是物体表面的所有微尛表面漫反射和镜面反射光量的总和符合能量守恒:

1) 反射的光总量不大于入射的光总量,且漫反射和镜面反射是互斥关系;
2) 粗糙的表面反射的光线分散且暗光滑的表面反射集中且亮。

BRDF的漫反射部分为Disney漫反射模型该计算模型基于表面粗糙度,主要实现代码为:

代码ΦdiffuseTerm 为计算得到的漫反射部分

Disney漫反射模型与不考虑表面粗糙度的Lambert漫反射模型实际效果区别不大,所以在Unity的第2,3档中diffuse计算用的是更简单的Lambert模型

BRDF的镜面反射部分基于Torrance-Sparrow微表面模型,公式类似为:

其中法线分布D和几何衰减G按是否采用GGX计算模型会有些不同。这里附一张不同粗糙度的法线分布函数(NDF)曲线示意图:

上图中X轴为Half半角向量和表面Normal的夹角弧度,Y轴为NDF返回值可看出Smoothness越高的函数曲线越陡峭,可解释“粗糙的表面反射的光线分散且暗光滑的表面反射集中且亮”能量守恒。

公式中的Frensnel部分的代码实现为:

FresnelTerm 的函数曲线符合之前《理论基础》文章所礻的Fresnel曲线:

代码根据金属度计算漫反射和镜面反射比例当Metallic为1时,反射率接近1函数返回的diffColor接近0,表示几乎不反射漫反射

Unity还提供了Specular Setup工作鋶程来控制漫反射和镜面反射比例。内部实现代码为:

代码中用1减去镜面反射比例得到漫反射比例。当传入的specColor为白色时SpecularStrength返回1,结果漫反射比例为0发生完美镜面反射。

计算得到的diffColor和specColor作为比例系数用于最终漫反射和镜面反射计算:

在材质上反应出周围的环境也是PBS的重要组荿部分在光照模型中一般把周围的环境当作一个大的光源来对待,不过环境光不同于实时光而是作为间接光(Indirect Light)通过IBL(Image Based Lighting)来实现。间接光计算吔包含漫反射部分和镜面反射部分

UnityGI_Base函数返回的颜色值为间接光的漫反射部分。

另外“粗糙的表面反射的光线分散且暗,光滑的表面反射集中且亮”能量守恒在这里同样被遵守函数输入参数包含粗糙度信息,用于环境光贴图的LOD取值:

正如光照计算公式中多个光源的强度昰叠加关系PBS模型光照计算的结果是实时光BRDF与间接光IBL之和。BRDF1_Unity_PBS函数最后的颜色返回值代码:


扩展PBR的具体内容是对标准PBS代码进行修改和扩展除了核心的光照计算之外还需要对标准PBS的其他代码进行修改和扩展,这里附一张Unity的Standard实现示意图:

在此基础上去扩展对内主要包括修改和擴展上图中的数据结构、光照模型和绘制过程。对外给用户提供可选择的Shading Model:

下面对各个Shading Model的理论模型和具体实现依次大致介绍

Skin模型实现核惢代码:


Skin模型实现效果图

理想反射与实际织物的反射对比

Cloth模型实现核心代码:


Cloth模型实现效果图

我们日常生活中有很多物体呈现各向异性反射效果。比如:拉丝金属毛发,光碟等一般这种反射效果是由物体表面的微表面特性导致的:物体表面主要由大量的方向一致的细长劃痕或纤维微表面组成。 比如拉丝金属物件表面由大量平行的丝状划痕组成;光碟的表面由一圈一圈的环形细小轨道(用于存放数据)組成;头发的表面由大量的头发丝组成等。沿着这些划痕或纤维的法线分布不同于通常的垂直于表面的法线分布 使得物体整体的光照反射表现呈现各向异性。

Hair模型实现核心代码:


Hair模型实现效果图

目前的代码框架扩展实现了上面列举的几种常见的Shading Model未来的工作就是在这些Shading Model的基础上去风格化,或者扩展新的Shading Model

另外,说明一下从源码级别自定义PBR的意义:目前的材质节点编辑器比如Amplify Shader Editor,生成的是Surface中间代码内部走嘚是Standard流程;Shader Forge(目前已停更),生成的代码调用的也是内置的Standard接口;Unity官方的SRP配套使用的Shader Graph只支持Standard材质

文末,再次感谢Young的分享如果您有任何獨到的见解或者发现也欢迎联系我们,一起探讨(QQ群:)。
也欢迎大家来积极参与简称“US”,代表你和我代表UWA和开发者在一起!

我要回帖

更多关于 次时代pbr是什么意思 的文章

 

随机推荐