Notifications
Article
Unity标准着色器概述
Published 12 days ago
639
1
本文主要讲述UnityPBR(基于物理)着色器。
除了标准着色,Unity内置了一些其他着色器。
  • Standard:标准(金属工作流)。
  • Standard(Specular setup):标准(镜面反射工作流)。
  • Mobile:适用于移动设备的简化高性能着色器。
  • Nature:用于树木和地形。
  • GUI和UI:用于显示用户界面图形。
  • VR:VR。
  • AR:AR。
  • Custom:自定义。
  • Particles:粒子系统特效。
  • Projector:放映机。
  • Reflective:反射率。
  • Skybox:用于渲染所有几何体后面的背景环境。
  • Sprites:与2D精灵系统结合使用。
  • Tessellation:曲面细分。
  • Toon:卡通风格。
  • Unlit:用于完全绕过所有光照和阴影的渲染。
  • Autodesk Interactive:Autodesk交互。
Unity标准着色器是一个包含一整套功能的内置着色器。此着色器可用于渲染“真实世界”的对象,如石头、木头、玻璃、塑料和金属,并支持各种着色器类型和组合。只需在材质编辑器中使用或不使用各种纹理字段和参数即可启用或禁用此着色器的功能。
标准着色器还包含一种称为基于物理着色(PBR)的高级光照模型。PBR以一种模仿现实的方式模拟材质和光照之间的相互作用。PBR最近才在实时图形中成为可能。在光照和材质需要以直观而逼真的状态共存的情况下,这种光照模型的效果最佳。
我们基于物理着色背后的理念是创建一种用户友好的方法,在不同的光照条件下实现一致、合理的外观。它模拟了光在现实中的表现,而不使用可能有效或无效的多个临时模型。为此,它遵循物理学原理,包括能量守恒(意味着对象反射的光绝不会多于接受的光)、菲涅耳反射(所有表面在掠射角处具有更高的反射率)以及表面如何遮挡自身等。
标准着色器在设计时就考虑了硬表面(也称为“建筑材质”),能够处理大多数现实世界的材质,如石头、玻璃、陶瓷、黄铜、银或橡胶。甚至对于皮肤、头发和布料等非硬质材质也表现得很不错。
通过标准着色器,可将大量着色器类型(例如漫射、镜面反射、凹凸镜面反射、反射)组合到同一个可处理所有材质类型的着色器中。这样做的好处是,在场景的所有区域都使用相同的光照计算,从而在使用该着色器的所有模型中提供逼真、一致且可信的光照和着色分布。
能量守恒:这是一种物理学概念,可确保对象反射的光绝不会多于接受的光。材质的镜面反射越强,其漫射就应该越弱;表面越平滑,高光越强且高光面积越小。
上图,计算表面上每个点处渲染的光量时,此光量应与从环境接受的光量相同。粗糙表面的微平面受到更宽区域的光照影响。更光滑的表面将呈现更强且面积更小的高光。A点将光从光源反射到摄像机。B点呈现天空环境光产生的蓝色色调。C点从周围地面颜色接受环境光照和反射光照。
高动态范围(HDR):这是指超出常规0-1范围的颜色。例如,太阳很容易比蓝天亮十倍。
上图,使用高动态范围的场景。车窗中反射的阳光看起来比场景中的其他对象亮得多,因为已使用HDR对其进行处理。

金属工作流(Metallic)和镜面反射(Specular)工作流比较

使用标准着色器创建材质时,可选择以下两个选项之一:“Standard”和“Standard(Specular setup)”。两者接受的数据不同,如下所述:
Standard:着色器显示“Metallic”值,表示材质是否为金属性。在使用金属性材质的情况下,反照率颜色(Albedo)将控制镜面反射的颜色,且大多数光线以镜面反射形式反射。非金属性材质将具有与入射光颜色相同的镜面反射,并且在正面观察表面时几乎不会反射。
Standard(Specular setup):选择此着色器意味着使用传统方法。镜面反射颜色 (Specular)用于控制材质中镜面反射的颜色和强度。此设置可使镜面反射具有与漫射不同的颜色。
通常可使用上述任一种方法很好地表示最常见的材质类型,因此在大多数情况下,具体选择哪种方法是基于美术工作流程的个人喜好问题。例如,下面是标准(Standard)和标准镜面反射(Standard Specular)工作流程中创建的橡胶塑料材质的示例:
第一个图像代表金属性工作流程,此处我们将该材质设置为零(非金属性)。第二个设置几乎相同,但我们将镜面反射设置为接近黑色(因此我们不会得到金属性镜像反射)。有人可能会问这些值来自哪里,什么是“接近黑色”,究竟是什么让草与铝不同?在基于物理着色的世界中,我们可以使用来自已知真实材质的参考。

材质参数

标准着色器为您提供了一个材质参数列表。根据您选择在Metallic工作流程模式还是Specular工作流程模式下工作,这些参数会略有不同。这些参数可一起用于重现几乎任何真实世界表面的外观。

Rendering Mode(渲染模式)

此参数允许您选择对象是否使用透明度,如果是,使用哪种类型的混合模式。
  • Opaque:此项为默认设置,适用于没有透明区域的普通固体对象。
  • Cutout:用于创建在不透明区域和透明区域之间具有硬边的透明效果。在这种模式下,没有半透明区域,纹理为100%不透明或不可见。使用透明度来创建材质的形状时(如树叶或者有孔洞和碎布条的布料),这非常有用。
  • Transparent:适用于渲染逼真的透明材质,如透明塑料或玻璃。在此模式下,材质本身将采用透明度值(基于纹理的Alpha通道和色调颜色的Alpha),但与真实透明材质的情况一样,反射和光照高光将保持完全清晰可见。
  • Fade:允许透明度值完全淡出对象,包括对象可能具有的任何镜面高光或反射。如果要对淡入或淡出的对象进行动画化,此模式将非常有用。它不适合渲染逼真的透明材质,如透明塑料或玻璃,因为反射和高光也会淡出。

Albedo(反照率)

Albedo参数控制着表面的基色。为Albedo值指定单一颜色有时很有用,但为Albedo参数指定纹理贴图的做法更为常见。纹理贴图应表示对象表面的颜色。必须注意的是,反照率纹理不应包含任何光照,因为光照将根据看到对象的上下文添加到纹理中。
反照率颜色的Alpha值控制着材质的透明度级别。选择正确的透明度模式非常重要,因为此模式可确定您是否仍然会看到处于全值状态的反射和镜面高光,或它们是否也会根据透明度值淡出。
使用为Albedo参数指定的纹理时,可通过确保反照率纹理图像具有Alpha通道来控制材质的透明度。Alpha 通道值映射到透明度级别,其中以白色表示完全不透明,黑色表示完全透明。这将使材质可具有透明度不同的区域。

Metallic模式:Metallic(金属度)

在金属性工作流程(Standard)中工作时,表面的反射率和光响应将由Metallic级别和Smoothness(平滑度)级别进行修改。
使用此工作流程时仍会生成镜面反射,但它们是自然产生的,具体取决于您为Metallic和Smoothness级别提供的设置,而不是进行显式定义。
Metallic模式不仅适用于看起来具有金属性的材质。此模式之所以称为金属性(Metallic)模式,是因为您可以控制表面的金属性或非金属性。
材质的金属性(Metallic)参数决定了表面有多么“像金属”。当表面具有较高的金属性时,它会在更大程度上反射环境,并且反照率颜色将变得不那么明显。在最高金属性级别下,表面颜色完全由来自环境的反射驱动。当表面的金属性较低时,其反照率颜色会更清晰,并且所有表面反射均在表面颜色的基础之上可见,而不是遮挡住表面颜色。
默认情况下,如果未分配纹理,则Metallic和Smoothness参数均由滑动条控制。对于某些材质来说,这已足够了。但是,如果模型表面某些区域在反照率纹理中具有混合表面类型,则可以使用纹理贴图来控制金属性和平滑度级别在材质表面上的变化。例如,如果纹理包含角色的服装,其中包括一些金属搭扣和拉链,您会希望搭扣和拉链的金属性值高于服装面料的金属性值。为实现此目的,我们不使用单个滑动条值,而是可以分配一个纹理贴图,在贴图中为搭扣和拉链区域提供较亮的像素颜色,而为布料提供较暗的值。
为Metallic参数分配纹理后,Metallic和Smoothness滑动条都将消失。取而代之的是,材质的Metallic级别由纹理的红色通道中的值控制,而材质的Smoothness级别由纹理的Alpha通道控制。(这意味着忽略绿色和蓝色通道)。也就是说,使用单个纹理即可将区域定义为粗糙或平滑以及金属性或非金属性;在使用纹理贴图来覆盖模型中许多具有不同要求的区域时(例如,单个角色纹理贴图通常包含多种表面要求:皮鞋、布料、手和脸的皮肤以及金属搭扣),这将非常有用。
在上面的示例中,手提箱具有反照率贴图,但没有可用于金属性的纹理。这意味着整个对象具有单一的金属性和平滑度值,这是不理想的。皮革带、金属搭扣、贴纸和手柄都应具有不同的表面属性。
此示例中已分配金属/平滑度纹理贴图。搭扣现在具有较高的金属性值并相应地响应光照。皮革带比箱体的皮革本身更亮,但它们具有较低的“Metallic”值,因此看起来是闪亮的非金属表面。最右边的黑白贴图显示了金属为较亮区域,而皮革为中低灰色。

Specular模式:Specular(镜面反射)

Specular参数仅在使用Specular setup时可见。镜面反射(Specular)效果本质上是场景中光源的直接反射,通常会在对象表面上显示为明亮的高光和反光(尽管镜面高光也可能是微妙或漫射的)。
Specular setup和Metallic setup都会产生镜面高光,因此选择使用哪个选项更多取决于设置和您的艺术偏好。在Specular setup中,可直接控制镜面高光的亮度和色调,而在Metallic setup中,可控制其他参数,镜面高光的强度和颜色会作为其他参数设置的自然结果而出现。
在Specular模式下工作时,Specular参数中的RGB颜色将控制镜面反射率的强度和色调。这包括来自光源的光泽和来自环境的反射。Smoothness参数控制着镜面反射效果的清晰度。在平滑度值较低的情况下,即使强烈的镜面反射也会出现模糊和漫射。在平滑度值较高的情况下,镜面反射更明显、更清晰。
有时,可能希望改变材质表面上的Specular值;例如,如果纹理包含角色的外套,而外套上有一些闪亮的按钮,您会希望按钮的镜面反射值高于服装面料的镜面反射值。要实现此目的,请分配纹理贴图,而不使用单个滑动条值。这样可以根据镜面反射贴图的像素颜色更好地控制材质表面上的镜面光反射的强度和颜色。
为Specular参数分配纹理后,Specular参数和Smoothness滑动条都将消失。取而代之的是,材质的Specular级别由纹理本身的红色、绿色和蓝色通道中的值控制,而材质的Smoothness级别由同一纹理的Alpha通道控制。因此,通过提供单个纹理,即可将区域定义为粗糙或平滑,并具有不同的镜面反射级别和颜色。在使用纹理贴图来覆盖模型中许多具有不同要求的区域时(例如,单个角色纹理贴图通常包含多种表面要求,如皮鞋、布料、手和脸的皮肤以及金属搭扣),这将非常有用。
此处,镜面反射和平滑度由颜色和Smoothness滑动条定义。由于未分配纹理,因此镜面反射和平滑度在整个表面上保持不变。这种状态并非总是令人满意,特别是在反照率纹理映射到模型上各种不同区域(也称为纹理图集)的情况下。
此处,纹理贴图控制着镜面反射和平滑度。这种情况下允许镜面反射在模型的表面上变化。请注意,边缘具有比中心位置更高的镜面反射效果,表面对光线有一些微妙的颜色响应,并且字母内部的区域不再有镜面高光。右图是用于控制镜面反射颜色和强度的RGB通道以及用于控制平滑度的Alpha通道。
注意:黑色镜面反射颜色(0,0,0)将使镜面反射效果无效。

Smoothness(平滑度)

平滑度的概念同时适用于镜面反射(Specular)工作流程和金属性(Metallic)工作流程,并且在两者中的工作方式非常相同。默认情况下,如果未分配Metallic或Specular纹理映射,则材质的平滑度由滑动条控制。此滑动条可用于控制表面上的“微表面细节”或平滑度。如果您选择使用Metallic或Specular参数的纹理贴图,则会从该贴图中获取平滑度值。
在Unity中,“微表面细节”不是直接可见的。它是光照计算中使用的概念。但是,您可以看到这个微表面细节的效果,它表示当光线从对象反弹时散射的光量。在光滑的表面上,所有光线都倾向于以可预测和一致的角度反弹。在极端的情况下,一个完美光滑表面的光反射就像镜子一样。较不光滑的表面会在较宽的角度范围内反光(当光照射到微表面的凸起时),因此反射具有较少的细节并以更倾向于漫射的方式在表面上扩散。
光滑的表面具有非常低的微表面细节,或者根本没有,因此光线以均匀的方式反弹,形成清晰的反射。粗糙的表面在其微表面细节中具有高峰和低谷,因此光线在很宽的角度范围内反弹,平均下来将产生漫射颜色,看不到清晰的反射。
在低平滑度级别下,表面上每个点的反射光来自较宽的区域,因为微表面细节凹凸不平并散射光。在高平滑度值下,每个点的光线来自狭窄的聚焦区域,因此能更清晰地反射对象的环境。
与许多其他参数类似,您可以分配纹理贴图,而不使用单个滑动条值。这样可以更好地控制材质表面上的镜面光反射的强度和颜色。使用贴图而不使用滑动条意味着,可创建包含表面上各种平滑度级别的材质(通常设计为与反照率纹理中显示的值匹配)。

Normal Map(法线贴图)

法线贴图是一种凹凸贴图(Bump Map)。它们是一种特殊的纹理,可让您将表面细节(如凹凸、凹槽和划痕)添加到模型,从而捕捉光线,就像由真实几何体表示一样。例如,您可能希望显示一个表面,在表面上有凹槽和螺钉或铆钉,比如飞机机身。为实现此目的,一种方法是将这些细节建模为几何体,如下所示。
根据具体情况,将这些微小的细节建模为“真实”几何体通常并非一种好的思路。在右侧,您可以看到构成单个螺丝头的细节所需的多边形。在具有大量精细表面细节的大型模型上,这种方案需要绘制极大数量的多边形。为了避免这种情况,我们应使用法线贴图来表示精细的表面细节,而使用分辨率较低的多边形表面来表示模型的较大形状。
如果我们改用凹凸贴图来表示此细节,则表面几何体可以变得简单得多,并且细节将通过纹理呈现,用纹理来调节表面如何反射光。现代图形硬件可以非常快速地完成此过程。现在,金属表面可变为一个简单多边形平面,而螺钉、铆钉、凹槽和划痕将捕捉光线,并会因为纹理而显得有深度。
法线贴图和高度贴图都是凹凸贴图的类型。二者都包含一些数据用于表示较简单多边形网格的表面上的明显细节,但各自却以不同的方式存储这些数据。
在上方左侧,您可以看到用于石墙凹凸贴图的高度贴图。高度贴图是一种简单的黑白纹理,其中每个像素表示该点在表面上看起来应该凸起的程度。像素颜色越白,该区域看起来越高。
法线贴图是RGB纹理,其中每个像素表示表面看起来应该面向的方向的差异(相对于其未经修改的表面法线)。由于矢量存储在RGB值中的方式,这些纹理往往为蓝紫色调。
代实时3D图形硬件依赖于法线贴图,因为此类型的贴图包含了必要的矢量来修改在表面上反射光线的方式。Unity还可接受高度贴图类型的凹凸贴图,但必须在导入时将其转换为法线贴图才能使用。
像往常一样,可通过将纹理文件放入Assets文件夹的方式导入法线贴图。但是,需要告诉Unity,此纹理为法线贴图。为此,可在导入检视面板(Inspector)设置中将“Texture Type”设置更改为“Normal Map”。
要将黑白高度贴图作为法线贴图导入,除了需要选中“Create from Greyscale”选项外,过程几乎完全相同。
选中“Create From Greyscale”后,检视面板中将显示Bumpiness滑动条。从高度贴图中的高度进行转换时,可使用此滑动条来控制法线贴图中的角度剧烈程度。较低的凹凸值意味着,即使高度贴图中的鲜明对比度也会转换为平缓的角度和凹凸。较高的值会产生夸张的凹凸和对凹凸的高对比度光照响应。
如果导入了法线贴图或高度贴图,但未将其标记为法线贴图(通过选择 Texture Type: Normal Map),,系统会显示“Fix Now”警告。单击“Fix Now”与在纹理检视面板设置中选择Texture Type:Normal Map具有相同的效果。如果您的纹理确实是发现地图,此操作将起作用。但是,如果是灰度高度贴图,系统不会自动检测到这一情况,因此对于高度图,必须始终在纹理的Inspector窗口中选中“Create from Greyscale”选项。
您可能还注意到,标准着色器的材质检视面板下方较远位置还有第二个Normal Map字段。此选项允许您使用额外的法线贴图来创建额外的细节。您可以使用与常规Normal Map字段相同的方式将法线贴图添加到此字段中,但此处的意图是您应当使用不同的平铺比例或频率,从而使两个法线贴图以不同的比例一起生成高细节级别。例如,常规法线贴图可能定义墙壁或车辆上的镶板细节,并使用面板边缘的凹槽。辅助法线贴图可为表面上的划痕和磨损提供非常精细的凹凸细节,因此能够使用基础法线贴图的比例的5至10倍进行平铺。这些细节可能非常精细,只有仔细检查时才能看到。要在基础法线贴图上有这么多细节,基础法线贴图必须非常大,但是通过将二者放在不同比例下,可使用两个相对较小的法线贴图纹理来实现较高的整体细节级别。

Height Map(高度贴图)

高度贴图(也称为视差贴图)是与法线贴图类似的概念,但是这种技术更复杂,因此性能成本也更高。高度贴图往往与法线贴图结合使用,通常情况下,当纹理贴图负责渲染表面的大型凸起时,高度贴图用于为表面提供额外的定义。
虽然法线贴图可修改纹理表面上的光照,但视差高度贴图更进一步并实际上可移动可见表面纹理的区域,从而实现一种表面级遮挡效果。这意味着,对于明显的凸起,它们的近侧(面向摄像机)将膨胀和扩大,而它们的远侧(背离摄像机)将减小并且看起来被遮挡。
这种效果尽管可以产生非常令人信服的3D几何体表示,但仍然受限于对象网格的平面多边形的表面。也就是说,虽然表面凸起看起来会突出和相互遮挡,但模型的“轮廓”绝不会被修改,因为最终效果将绘制到模型的表面上,不会修改实际的几何体。
高度贴图应为灰度图像,其中以白色区域表示纹理的高区域,以黑色表示低区域。以下是典型的反照率贴图和要匹配的高度贴图。
上图从左到右为:1.分配了反照率贴图但未分配法线贴图和高度贴图的岩石墙壁材质。2.分配了法线贴图。表面上的光照经过修改,但岩石不会相互遮挡。3.分配了法线贴图和高度贴图的最终效果。岩石看起来从表面突出,较近的岩石似乎遮挡了它们后面的岩石。

Occlusion(遮挡贴图)

遮挡贴图用于提供关于模型哪些区域应接受高或低间接光照的信息。间接光照来自环境光照和反射,因此模型的深度凹陷部分(例如裂缝或折叠位置)实际上不会接收到太多的间接光照。
遮挡纹理贴图通常由3D应用程序使用建模器或第三方软件直接从3D模型进行计算。
遮挡贴图是灰度图像,其中以白色表示应接受完全间接光照的区域,以黑色表示没有间接光照。有时,对于简单的表面而言,这就像灰度高度贴图一样简单(例如前面高度贴图示例中显示的凸起石墙纹理)。
在其他情况下,生成正确的遮挡纹理稍微复杂一些。例如,如果场景中的角色穿着罩袍,则罩袍的内边缘应设置为非常低的间接光照,或者完全没有光照。在这些情况下,遮挡贴图通常将由美术师制作,使用3D应用程序基于模型自动生成遮挡贴图。

Emission(自发光)

(待后续更新)

辅助贴图(细节贴图)和细节遮罩

辅助贴图(或细节贴图)允许您在上面列出的主纹理上覆盖第二组纹理。您可以应用第二个反照率颜色贴图和第二个法线贴图。通常,与主要的反照率贴图和细节贴图相比,这些辅助贴图将映射到对象表面上重复多次且小得多的范围。
这样做的原因是允许材质在近距离观察时具有清晰的细节,同时在从更远处观察时具有正常的细节级别,而不必使用单个极高的纹理贴图来实现两个目标。
细节纹理的典型用途为:
  • 为角色的皮肤添加皮肤细节,如毛孔和毛发。
  • 在砖墙上添加微小的裂缝和地衣生长效果。
  • 为大型金属容器添加小划痕和磨损。
如果使用单个法线贴图,请务必将其插入主通道。辅助法线贴图通道比主通道的成本更高,但具有完全相同的效果。
细节遮罩纹理允许您在模型的某些区域禁止应用细节纹理。这意味着可在某些区域显示细节纹理,而在其他区域隐藏细节纹理。在上面的皮肤毛孔示例中,您可能希望创建遮罩,使毛孔不会显示在嘴唇和眉毛上。
Tags:
尹煜
北京宏宇航天技术有限公司Unity工程师 - Programmer
28
Comments
艺术家
感谢分享
1