金属模式:金属参数


当在金属工作流(不同于镜面工作流)下工作时,表面的反射成都和光照反应由金属性级别和平滑度级别来修改。

当使用这个工作流时,镜面反射仍然被生成;但依赖于给予Metallic和Smoothness级别的设置而自然出现,不是被指定的。
金属模式并非仅仅用于看起来应该是金属的材质!此模式名为金属,是因为用户控制表面如何成为金属或非金属的方式。

金属性参数

材质的金属参数决定了表面如何“像金属那样”。当一个表面更加金属化,它更多地反射环境,albedo色变得更难看到。在完全金属级别下,表面颜色完全由环境的反射而驱动。当表面更不金属化,他的albedo色更清晰,并且在表面颜色上,任何表面反射是可见的,而不是隐藏掉。

金属值从0到1范围(平滑值保持为常数0.8)。
默认情况下,没有纹理被分配,金属性和平滑度参数各用一个滑块条控制。这对于某些材质已然够用了。然而如果模型的表面在albedo纹理中有表面类型的混合,可以使用纹理贴图来控制金属性和平滑度级别如何在通过材质表面时改变。例如,如果纹理包含了一个角色的衣服,包括一些金属纽扣与编码。用户将希望纽扣和编码比衣服的布料有更高的金属值。为了达成此目的,不使用单一一个滑块值,可以分配一个在纽扣和编码区域包含了更高像素颜色的纹理贴图,以及在布料处为更暗的值。
随着一个纹理分配给金属性参数,金属性和平滑度滑块会消失。取代的是:被通过纹理的红色通道所控制的材质金属级别。并且材质的平滑级别会被纹理的alpha通道控制。(这意味着绿色和蓝色通道被忽略了)。这意味着你有单个可以定义区域是粗糙或平滑、金属或非金属的纹理,当工作于覆盖了一个对于很多区域有不同要求的模型的纹理贴图时很有用——例如一个角色的纹理贴图经常巴夯多种表面要求:皮鞋,布料衣物,手与脸的皮肤,以及金属纽扣。


这幅图展示了模型没有金属贴图的情形。
在上面的例子中,有一个albedo贴图,但没有对金属的纹理。这意味着整个物体只有单个金属性数值和平滑度数值,并不合理。Leather straps,金属纽扣,sticker和handle应当都出现不同的表面性质。

这幅图展示了模型应用了金属贴图的情况。
在这个例子中,一个金属/平滑的纹理贴图已被分配。纽扣现在拥有高的金属值,由此对光照有反应。盒子的Leather straps比leather body更闪亮,然而它们金属值低,所以显出闪亮的非金属表面。在右端远处的黑色、白色贴图展示了对金属更光亮的区域,以及对leather中等到低的灰度。

平滑度


平滑参数,在金属和镜面着色器模式的平滑参数都展示了。
平滑度的概念在镜面工作流和金属工作流下均可应用,并且在两种工作流下工作的方式大部分都一样。默认下,没有一个金属或者镜面纹理贴图被分配时,材质的平滑度由一个滑块控制。此滑块允许你控制“微小表面细节”或者纵贯表面的平滑度。
两个着色器模式在上面展示了;因为如果选择使用一个纹理贴图用户金属或锦棉参数,平滑度的值也从相同的贴图中采用。这在下一页中进行更细节地解释。


平滑度范围从0到1。
“微表面细节”在Unity里是无法直接看到的东西——但近在眼前。它是在光照计算中使用的概念。用户可以看到被光照数量所表现的微表面细节的效果被漫射,像是从物体上弹开。对于平滑的表面,所有光线趋向于在一个可预测及一致的角度弹开。极端情况下,一个完美平滑的表面像镜子一样反射光照。不那么平滑的表面,在更宽的角度范围内反射光照(由于光照碰到微小表面的隆起),因此反射的细节更少,被表面以更散漫的方式所传播。

一个材质的微表面细节理论在平滑度低、中、高时对比的示意图。黄色的线表示:在平滑程度变化情况下,光线接触到表面并反射的角度。
平滑的表面有非常低的微表面细节,或者根本没有,所以光线以统一的方式反弹,形成清晰的反射。粗糙的表面在它微表面细节存在高峰和低谷,所以光线在宽的角度范围反弹——均匀后的输出形成了漫射的颜色,没有清晰的反射。

使用平滑度纹理贴图

类似于其它很多参数,可以用分配纹理贴图来代替使用单个滑块数值。这允许了更好的控制:用户可以改变在材质表面上镜面光照反射的强度和颜色。
由于表面上每个点的平滑度是单独的值,图片纹理只有一个通道被当做数据使用。因此平滑度数据被设定为储存在用于金属性或者镜面纹理贴图相同的图片纹理的alpha通道中(依赖于用户使用的模式)。
当在镜面工作流中工作时,如果分配了一个镜面纹理,平滑度滑块不再可用,因为镜面纹理的alpha通道将会被用户作为材质表面的平滑度数值。
类似地,在金属工作流工作时,如果分配了一个金属性纹理,平滑度数据采用金属性纹理的alpha通道。
使用贴图取代滑块,意味着可以创建在表面上有不同平滑度级别的材质(通常被设计来匹配在albedo纹理中显示的)。

左边:没有为镜面分配贴图,所以对平滑度有一个滑块。右边:分配给镜面一个贴图,所以图片的灰度alpha通道值用于平滑贴图。
更平滑的表面更能反射,有更小更紧密集中的镜面高光。不平滑的表面不会反射这么多,并且镜面高光不那么显眼,在表面上散开得更宽。通过将镜面和平滑度贴图匹配到在albedo贴图中的内容,可以开始创建看起来非常真实的纹理。

法线贴图(凹凸贴图)


法线贴图是凹凸贴图的一种。它们是允许向模型添加如凹凸、沟槽和抓痕这样,仿佛被实素几何学表现那样发光的表面细节的一种特定纹理。
例如,用户可能希望展示一个有沟槽,以及螺钉或铆钉的表面,比如飞机的外壳。一种实现的方法是将细节作为几何学建模,如下图所示。

一块用实素几何学建模的,带细节的平面金属。
根据具体情形,有这样微小的用“真实”几何学建模的细节通常不是好的办法。在右边可以看到,所要求的多边形组成了单个螺钉头的细节。对于带有大量精妙表面细节的大模型,这将要求非常高数量的多边形被绘制。为了避免这种情况,将使用一个法线贴图来表现精致的表面细节,以及为模型更大的形状使用更低分辨率的多边形表面。
如果换用一个凹凸贴图表现这个细节,表面几何学可以变得简单得多,细节可以表现为一个调整光如何在表面反射的纹理。这是现代图形硬件可以相当迅速做到的事情。由于纹理,金属表面现在可以成为一个低多边形的平面;并且螺钉,铆钉,沟槽和刮痕将反射光线并显得有深度。

螺钉,沟槽和刮痕在一个法线贴图中定义,这个贴图修改了光如何在这个低多边形平面表面上反射,给出了3D细节的展示。除了铆钉螺钉,纹理允许包括像微小凹凸和刮痕这样多得多的细节。
在现代的游戏开发美术流程中,美工将使用他们的3D建模应用来生成,基于非常高的分辨率源模型的法线贴图。之后这些发现贴图贴到更低分辨率、用于游戏的模型版本,这样原始的高分辨率细节,用法线贴图来渲染。

如何创建和使用凹凸贴图

如何创建和使用凹凸贴图

凹凸贴图是相对老的技术了,但它是实时真实渲染中提升渲染细节的核心手段。Bump Maps通常也叫Normal Maps(法线贴图)或是Height Maps(高度图),但是他们还是稍微有些不一样,请往下面。

What are Surface Normals?

什么是表面法线?

解析说明normal mapping(法线映射)是怎么工作的,我们首先了解,什么叫"normal"(法线),以及实时光照中怎么使用。最基础的例子:一个模型上的每个多边形表面的光效,都是对应着该表面相对光源位置的角度来计算的。表面的角度可以用一条垂直于表面方向的线来代表,这条线的方向(是个向量)该表面我们称之为"surface normal"(表面法线),或是简称:normal(法线)。

两个12面数的圆柱体,左边的是flat(平坦法线)的着色,右边的是smoothed(平滑法线)着色

上图中,左边的圆柱体使用基础的flat着色,每个多边形都根据法线与光源的相对角度来着色。每个多边形的光效都一样,因为这是使用flat着色(平坦着色算法)。两个圆柱体,显示边框:

两个12面数的圆柱体,左边的是flat(平坦法线)的着色,右边的是smoothed(平滑法线)着色

右边的模型和左变得多边形数量一样多,但右边的显示多边形表面光阴光滑很多。为啥酱紫?这是因为每个光栅点上的surface normal(表面法线)都是在多个顶点间做了法线渐变过渡处理,所以表面上任意一点,他的光效反弹的表面法线都是渐变的平滑的,而不是以一个多边形表面决定所有决定该面所有法线方向。

以2D图解说明,在三个多边形表面上的flat-shaded(平坦着色)就像这样:

三多边形的Flat着色,以2D图解显示

表面法线以橙色箭头显示。这是用于计算表面反射光源效果使用的,每个多边形的表面反射光源肯定是一样的,因为每个表面法线都是相同的方向。因此才叫"flat shading",所以左边圆柱体多边形显示光阴过渡都是硬边。(所谓硬:过渡不平滑,很生硬)

平滑着色的圆柱体与平坦着色不一样,下图:

以2D图解显示,平滑着色的三多边形

多边形上的表面法线都是渐变的过渡,以平滑表面法线过渡,提升了着色表面曲线显示效果(图中绿线)。这不会影响网格多边形,仅仅是影响在该表面中光照计算的效果。这个平滑的表面不是真实存在的,你可以从圆柱体,Top view(定视图),Bottom view(底视图)看到多边形的表面其实还是平坦的,只是大多数角度看过去是平滑的表面。

使用这种平滑的着色,法线数据是存于每个vertex(顶点)的,所以改变一个顶点的法线数据将会影响周围临近顶点的表面法线差值过渡效果。在上图中,红色角度代表存储在每个顶点的法线方向,橙色代表的是多边形的临近顶点的差值法线方向。

什么是法线贴图?

什么是法线映射?

法线映射存储着表面法线的修改信息,就是使用一张纹理来存储模型表面法线如何修改的信息。一张法线贴图其实就一张图片,此图映射着模型的表面信息,就像常规的颜色纹理,然而法线贴图中的每个像素(称为:纹素)代表着表面法线的偏移信息,与真实的平坦表面法线很不相同(使用差值过渡)。

以2D图解显示,三多边形的法线映射

此图解中,以2D显示模型三多边形表面,每个橙色箭头对应着法线贴图中一个像素的映射数据。图中下面的像素条,就是法线映射纹理中单个像素切片的内容。在中间那段,你可以看到法线被修改了,这些法线数据就影响多边形表面的凹凸效果。这些凹凸想过只有在光照到表面是,才会看到,因为修改的法线信息用于光照计算用的。

这些源法线贴图一般颜色都是偏蓝色的色调,且不含任何的光影信息,这是因为这些颜色本身不用于像普通文理直接显示纹路用。而是,每个纹素的RGB代表着X,Y,Z的向量,然后应用于多边形上的表面法线的差值平滑过渡。

法线贴图纹理的例子

这是个简单的法线贴图,包含了矩形和文本的凹凸信息。这个法线贴图可以导入Unity后设置在使用了Standard Shader的材质中的法线贴图槽位中。当材质中加入了颜色贴图(Albedo贴图)并将法线贴图应用到上面的圆柱体中,结果如下:

上面的圆柱体应用了法线贴图的例子

再次提醒,这不会影响原来真实的网格,仅仅影响表面上的光照效果的计算。这表面上的文字和矩形的凹凸效果其实不是真实存在的,你可以种模型的侧边看到真实的表面(真实的表面:还是平坦的),然而大多数的视觉角度看圆柱体都会表面浮雕效果的细节。

How do i get or make normal maps?

该如何获得或制作这样的法线贴图呢?

通常,法线贴图是由美术同学使用3D软件和模型一起生成的,且多数是你从Albedo贴图中复制出来调整的。有时是手动画的,有时是中3D软件中渲染出来的。

如何从3D软件中渲染出法线,这超出了我们要讲的内容范围,3D美术同学将会导出两个版本的模型 - 高精度模型(高模)包含了所有多边形细节,而低模是给游戏运行时准备的。高精度模型因细节太多而不能在游戏中优化(网格太多三角面),只是用于3D建模软件生成法线贴图用的。低模则省略了很多几何体的细节,现在都存在了法线贴图中,所以可以使用法线贴图来渲染。典型的例子是在角色上的衣服显示皱纹,纽扣,接缝处的效果。

还有一些软件可以分析一整照片纹理,并从中提取出一张法线贴图。假设源纹理是带有一个方向光的光照信息,亮的与暗的区域假设就对应着表面的角度。然而,在使用bump map(凹凸贴图)时,确保你的Albedo纹理是不含光照信息的,理想的就仅含表面颜色信息而不含光照信息,因为光照信息将会在Unity中,以光源方向,表面角度和凹凸信息来计算的。

这有两个例子,一个是简单的重复的石墙纹理和对应着的法线贴图,另个是角色纹理集对应的法线贴图:

石墙纹理和对应的法线纹理

角色纹理集合对应的法线贴图集

What’s the difference between Bump Maps, Normal Maps and Height Maps?

Bump Maps, Normal Maps和Height Maps的区别?

Normal Maps(法线贴图)和Height Maps(高度贴图)都是属于Bump Map(凹凸贴图)。它们都包含了代表简模多边形表面的细节数据,但它们存储数据的方式不一样。

左边的是石墙凹凸贴图的高度贴图。右边的是石墙凹凸贴图的法线贴图。

在上面,左边的你可以看到石墙的凹凸映射的高度贴图。一张高度贴图是简单的黑白图,每个像素代表着表面应该提升多少(负数代表下降)的量。越白的像素颜色,对应着提升的更高。

另一张法线贴图是RGB纹理,每个像素代表着表面的不同的方向,都是相对于没有修改表面数据的值来存储的。这些纹理都偏蓝紫色调,因为RGB值存储的是向量值。

现代的3D图形硬件都会使用Normal Maps,因为它们包含了表面如何反射光线的法线向量调整值。Unity也接受Height Maps来作为Bump Mapping,为了使用这些贴图,必须在导入纹理时设置转换成Nomral Maps类型的纹理。

Why the bluey-purple colours?

为何是偏蓝紫色呢?

注意着不是使用法线贴图的必要内容。如果需要时可以跳过的部分。然而,如果你真想了解:RGB颜色用于存储X,Y,Z方向向量,Z表达上"up"(向上:与Unity中的Y向上不一样)。另外,纹理上的值都从0.5为初始值,这样就可以存储所有的向量方向了(因为0位初始值得话,那么方向偏移将都指定正区间的,而中0.5定为初始值,小于0.5都是负区间值,大于就是正区间值,这样,3D空间中的方向都可以指定了,但是还是与精度相关,这里就不纠结了)。因为要将RGB转化为一个向量方向,你必须先x2,在减1。例如,一个RGB(0.5,0.5,1)或是#8080FF(16进制)对应向量结果是:(0,0,1),该向量是"up"(向上)的法线映射,代表着模型表面的法线方向没有偏移。这就是你在之前例子中看到的平坦区域的颜色。

一张全为#8080FF数据的法线贴图,转化为向量就是0,0,1。这对于多边形的表面法线来说是没有修改的,因此不会对光照有变化。任意一个不同于这颜色的像素都意味着该点有不一样的方向,该点在计算光照反弹时可用该点对应的方向偏移值更改表面法线角度。

值为(0.43, 0.91, 0.80)将得到(-0.14, 0.82, 0.6)的向量,这将把表面法线修改得相当陡。这个颜色对应着石墙中那些在石头之间顶部比较明亮的区域。这会让石头边缘的光源计算非常不同于平坦表面的效果。


没有凹凸贴图效果的石墙。


同样的石墙,但这个是带有凹凸贴图应用的。石头表面反射太阳光都不相同。

同样是应用了凹凸贴图的石墙,但灯光不同的场景。一个点光源的火炬照亮着使用。石墙上的每个光栅像素光照计算都是根据法线贴图向量修改了模型表面与光源方向进行的。因此法线朝向向光源的都亮起来了,反之则越来越暗,甚至都基本是阴影中。

How to import and use Normal Maps and Height Maps

如何导入和使用法线贴图和高度贴图

法线贴图放到项目中的Assets文件夹下就能导入。然而你需要告诉Unity,这是张法线贴图。你可以在Inspector更改"Texture Type"设置为"Normal Map"。

导入黑白的高度贴图与法线贴图基本一样,需要可勾选"Create from Greyscale"选项。

勾上"Create From Greyscale"选项后,Bumpiness在法线贴图中控制法线倾斜度,在高度贴图中使用将控制高度系数。底bumpiness数值是意味着凹凸效果没那么强。反之很强。

Bumpiness数值的底和高,在模型上的效果。

你可以将你的法线贴图资源设置到材质中的Inspector的法线贴图槽位中。Standard Shader有一个法线槽位,需要旧版本的shader也支持法线贴图。

使用Standard Shader,设置了一个法线贴图文理在正确的材质槽位中

如果你导入了一张法线贴图或是高度贴图,然后没有将其设置为法线贴图(之前提及的Texture Type: Normal Map),材质的Inspector将会警告和提示修复,如下:

"Fix Now"警告按钮将会在法线槽位设置了Texture Type不是Normal Map的纹理时出现

点击"Fix Now"效果将和手动设置Texture Type:Normal Map效果一致。如果你设置的纹理是个法线贴图类型的纹理将能正常工作。然而,如果是灰度图的高度贴图,这将不会自动检测并提示,所以高度贴图你必须将"Create from Greyscale"选项勾上。

Secondary Normal Maps

你也许留意到Standard Shader材质Inspector下方有个第二个Normal Map槽位。这将允许你使用另一张法线贴图来创建额外的细节。例如,你可以在第一张法线贴图控制车辆上的凹凸细节,而第二张法线贴图用于控制车上的刮痕,将第二张法线贴图的效果放大一些刮痕就更明显了,这将可以提高更多的表面细节。这样法线贴图分层控制细节,可以减少单个法线贴图大小的,也可以用于控制细节开光(只要不设置就默认关闭)。

unity标准着色器入门-材质参数(二)相关推荐

  1. unity标准着色器入门-材质参数(一)

    材质参数 标准着色器展示了材质参数的列表.取决于你是否已经选择在金属工作流模式或者镜面工作流模式,这些参数会有轻微地变化.大部分参数在两种模式下是一样的,材质参数系列将覆盖两种模式的所有参数. 这些参 ...

  2. Unity开发备忘录000006:用Unity标准着色器构建金属材质效果(二)

    按照Unity开发备忘录000005:用Unity标准着色器构建金属材质效果(一)所介绍的方法,我们又做了一个如下的模型渲染. 在此基础上我们再给它加一个高度贴图,其立体感的细节会更加丰富,如下图: ...

  3. Unity开发备忘录000005:用Unity标准着色器构建金属材质效果(一)

    网上有很多第三方开发的构建金属材质的Unity包,但其实Unity自带的标准着色器Standard就可以调出不错的金属材质效果. 首先,建一个Unity工程,并创建一个球体对象,为了效果明显再添加一个 ...

  4. unity Shader Lab(cg hlsl glsl)着色器入门教程 以及 vs2019 支持unity shader语法(更新中2019.9.5)

    前言: 如果你对cg glsl hlsl 顶点着色器 片段着色器 表面着色器 固定渲染管线 等等有所疑惑,或是想学会unity的渲染,看这一篇就足够了.另外我博客的shader分类中还有很多shade ...

  5. unity关于纹理、着色器和材质的介绍

    图形资源可以分解为纹理.着色器和材质.纹理和着色器应用于材质,然后把材质应用于模型. 纹理(Texture):应用于3D对象的平面图像,使模型变得色彩斑斓,而不是只有形状. 创建一个复杂模型时,常用展 ...

  6. Unity3D 5 官方教程:标准着色器

    Unity5 引入了名为标准着色器的一种新型内建着色器.此着色器被设计用于代替大量在以前的Unity版本里被使用的旧着色器--它代替了用于渲染"真实世界"物体如石头石块.木头.玻璃 ...

  7. Unity3D 5 官方教程:标准着色器:内容和环境;金属与镜面工作流

    内容和环境 当在Unity中考虑光照,很方便将概念区分.被称为"内容"的是被光照和被渲染的物品:而环境,是场景中存在的,影响了被照射物体的光. 环境 当光照一个物体时,搞清楚影响此 ...

  8. Unity Shader着色器优化

    对游戏开发者而言,着色器长久以来就是游戏开发中的重要部分,在Unity中编写并实现着色器的过程直观且高效,优秀的着色器还可以创造非常精美的游戏画面,同时保证极高的性能.今天将由Unity的技术工程师张 ...

  9. URP——着色器和材质——复杂光照Complex Lit

    Complex Lit Shader 复杂的灯光着色器包含了灯光着色器的所有功能,并添加了高级的材质特性.一些特性在这个着色器可能是相当多的资源密集型和需要Unity Shader Model 4.5 ...

最新文章

  1. 未来人工智能客户服务的5大优势
  2. Java三大特性: 封装、继承、多态
  3. 产品经理在早期如何快速学习?
  4. html 表格 单击,在HTML表格中单击“空”单元格
  5. 2699!Redmi Note 11潮流限定版再次发售:全球首发“全系悬浮工艺”
  6. MySQL 基准测试(mysqlslap)出现 Using a password on the command line interface can be insecure 警告
  7. python深度学习库keras——网络建模全解
  8. win7录屏_学用系列|清晰、体积小,这些录屏工具适合正在为录屏苦恼的你
  9. 辐流式重力浓缩池计算_污泥浓缩池工作方式
  10. 捷联惯导更新算法及误差分析汇总
  11. 易飞ERP工作流解决方案之【第三方OA系统集成】
  12. cs1.6服务器弹道优化,cs1.6弹道优化参数
  13. springboot项目制作漂亮的banner
  14. android平台的开源框架的思考
  15. 微型计算机联想c325,寓教于乐一体机 联想IdeaCentre B325评测
  16. 浏览器垃圾与回收机制
  17. Unity中的3D数学—02向量与矩阵
  18. 第三章:IP地址加掩码讲解和ping命令运用
  19. 软件可靠性分析方法有失效模式影响分析法、严酷度分析法、故障树分析法、事件树分析法、潜在线路分析法
  20. Android,通讯录导入,contacts,联系人

热门文章

  1. 站长 站长统计排除的访客IP
  2. 从0开始手写一个类似Linux的操作系统
  3. 单目标应用:基于北方苍鹰优化算法NGO的RBF神经网络数据分类(提供MATLAB代码)
  4. Eclipse安装CVS
  5. java毕业设计LM美食推荐网Mybatis+系统+数据库+调试部署
  6. JavaScript(11) - 阻止事件冒泡和默认行为,拖拽,事件监听器
  7. 七月算法机器学习笔记5 回归模型
  8. 研报:什么是RWAs 哪些DeFi协议在引入RWAs
  9. Redux中间件(redux-thunk、redux-promise、redux-saga)
  10. ITIL 的生命周期