原文档 : https://docs.google.com/document/d/1e69YOg6pYRmpTmAn33o7IIbFQMT1hQbn5TJFK9FMJlQ/edit?pli=1
机器翻译有错误请指正
Overview
Better Lit Shader是URP、Standard或HDRP管线中的Standard/Lit着色器的替代品。它的目标是取各种着色器的精华并将它们标准化,因此无论您使用哪种渲染管线,都可以使用像细分、细节纹理和分层(Layer Lit)等功能。它还提供了许多其他那些着色器不提供的功能,如平面着色(Flat Shading)、三面纹理(Triplanar)、随机采样(Stochastic Sampling)、多层混合(multiple layer blending)以及更紧凑的纹理打包(texture packing)模式以提高性能。
纹理格式
在Unity的内置渲染管线的Standard Shader中,你需要为高度、环境遮挡等各自准备一个纹理。这种做法非常浪费资源,因为你需要多次采样不同的纹理,并在内存中存储。相反,将数据打包在一起(将不同的数据打包在纹理内的通道)会更有效率。这样做可以减少采样的纹理数量,同时节省内存。默认的纹理打包格式是基于HDRP的纹理打包格式。
Albedo Texture:
RGB = 基本颜色
A = 高度或alpha图
Normal Map (法线图)
Mask Map(遮罩图):
R = Metallic(金属质感)
G = Occlusion(遮挡)
B = Detail Mask(细节遮罩)
A = Smoothness(光滑度)
这种纹理打包格式能够在三个纹理中提供完整的金属PBR规范。如果使用URP的Lit着色器或内置管线的Standard着色器,同样的数据需要五个纹理,所以这是一个相当大的改进。请注意,当使用Opaque着色器时,Better Lit Shader会在alpha通道中存储高度数据,以实现基于高度的效果。
另外,还有一个快速打包选项。当使用这个选项时,纹理会被打包成更紧凑的格式,节省了一个额外的纹理,失去了Metallic图。漫反射与原来相同,法线图现在包含了光滑度和AO通道。这种方式虽然牺牲了一些质量,但是在性能和内存使用上有了明显的提升
Packed Map
R = Smoothness(光滑度)
G = Normal Y(法线Y)
B = Occlusion(遮挡)
A = Normal X(法线X)
当打包模式设置为最快(fastest)时,所有的纹理都应该是打包模式。确保在打包纹理上关闭sRGB,因为数据应该以线性方式存储-如果你忘记了,用户界面会警告并提供一个“Fix”按钮。
这种方式打包纹理既节省了内存,也提高了GPU性能,但是法线质量略有损失。一般来说,在像岩石这样的有机表面上,这是不可察觉的,而在像汽车引擎盖这样的光滑表面上,由于渐变数据质量降低,可能会出现带状现象。
Setting
- Workfow 支持镜面或金属工作流,如果你不熟悉这些工作流,请参考 Unity 文档
- Lighting Model (光照模型) 当在BuildIn,Urp中可以选择使用 Simplifed 或 Standard 光照模型。HDRP这个选项忽略。
- Texture Packing (纹理数据包) 这是你设置着色器的纹理打包的地方。所有的纹理都将按照这里指定的格式进行。
- Noise Space (噪声空间)这个选项用于选择系统中所有噪声的计算方式。它可以基于对象的UV、局部空间或世界空间坐标进行计算。世界空间对于静态对象特别有用,这样每个放置的对象都会得到不同的噪声处理。请注意,UV空间中的噪声是在2维中计算的,因此比在局部或世界空间计算的3d噪声代价更低。
- Noise Quality (噪声质量)有四种噪声质量可供选择。基于纹理的噪声可能是优的,它使用你提供的噪声纹理。当需要3d噪声时,噪声将进行三面采样。你也可以使用低质量或高质量的程序噪声。在低质量中,计算2d或3d的单倍频值噪声,而在高质量中,计算并混合FBM函数中的三倍频噪声。最后,还有Worley噪声,它产生更细胞状的形状。
- Opacity (透明度 )你可以在Opaque和Alpha着色器之间选择。请注意,的大多数效果,如细分和高度混合,使用漫反射的alpha通道作为高度图,然而在Alpha模式下,它用于透明度。
- Cull Mode (剔除模式)这让你设置对象的剔除模式,将其绘制为单面、反转或双面。当它设置为Back以外时,会出现一个可以控制如何处理背面的法线和光照的选项。
- Normal Mode (法线模式)默认情况下,这里设置为
Textures
,使用切线空间法线图着色。然而,你可以将其设置为使用AutoNormal
,它从存储在alpha通道中的高度图产生法线。这样可以节省采样法线图的时间,对低端机来说可能更快。然而,请注意,这比基于纹理的法线质量差,当靠近时可能会变成块状。最后,有一个选项可以使用新的Surface Gradient
框架,当大量的法线贴图混合在一起时,它会产生更准确的法线。 - Flat Shading (平面着色) 平面着色允许你在平滑的顶点法线和三角形面法线之间进行插值,从而呈现出平面多边形的外观。低面风格。
Main Layer
Main Layer (着色器的主层) - 它在很大程度上类似于lit或standard着色器。
- UV Mode (UV模式) 你可以选择
UV
或Triplanar
纹理。当Triplanar
激活时,你可以选择Local
或World
,并调整三面纹理的对比度。模式设置为UV
时,你可以选择UV0
、UV1
,或者世界空间的投影坐标的任意轴。 - 根据打包模式,它可能会显示一个法线图,或者法线和遮罩图。这些图是可选的,如果槽位是空的则什么都不做。
- Stochastic 将启用纹理的随机采样,这将会去掉所有的平铺设置。随机有一个scale和contrast设置,混合方式和随机斑块的大小。纹理是基于Albedo的alpha通道中的数据进行高度图混合的,并且有滑块来控制混合的contrast,以及纹理块的大小。
- MicroShadows 模拟小尺度的表面阴影。
- apha clip threshold alpha裁剪阈值将让你裁剪掉着色器的alpha通道低于这个值的部分。
- Fuzzy shading (模糊明暗处理)一种菲涅耳着色,用于模拟天鹅绒和苔藓风格的表面。它有一个调色盘,以及一个用于控制菲涅尔内外边缘的强度乘数,以及一个用于控制衰减角度的功率滑块。
Detail Texture
着色器的细节纹理部分与HDRP Lit着色器的细节纹理完全相同,只是增加了如三面纹理和随机采样等功能。细节纹理的打包方式也与HDRP Lit着色器完全相同。纹理打包的方式如下:
R - 用于修改漫反射的亮度(0.5表示不修改)
G - 法线Y
B - 光滑度
A - 法线X
这种打包方式允许在一个纹理中实现适度的细节纹理。
Tint Mask
Tint Mask 是一种基于遮罩纹理有选择地对主图层的一部分进行着色的方法。你可以使用 4 种着色颜色,分别对应纹理的 R、G、B、A 通道的值。这可以优化单一纹理生成的多变体。例如,你绘制一张遮罩,使金属区域呈红色,皮革区域呈绿色,布料区域呈蓝色,其他区域则具有 alpha 通道中的白色。然后,你可以使用 4 个颜色控件分别对每个区域进行着色。
Filtering Texture Layers
纹理层过滤
确定纹理层权重的位置有多种方法,这些方法可以一起使用。
首先,通过纹理层权重来设定。这可以设置为顶点模式或纹理模式。在顶点模式下,顶点颜色的R通道将控制第一层纹理的权重,G通道控制第二层,B通道控制第三层。
在纹理模式下,使用一种纹理来执行这个相同的功能。这个纹理可以映射到UV坐标,但也可以在世界空间中投影。这是极其强大的!例如,你可能会使用Y投影模式来做一个自上而下的噪声纹理投影,并将其大小设置为覆盖世界中的100米。然后,根据这个地图在几种纹理之间进行混合,使得每一块使用这种材质的岩石在这100米区域内都获得独特的纹理。这只会增加一个纹理样本的权重。
Texture Layers
纹理图层
纹理图层是非常强大的附加功能,允许您将多个材质混合在一起。着色器支持最多3个额外的图层,就像主图层一样,可以选择不同的UV模式。
Layer Blend Mode
允许您控制图层与前一个图层的混合方式:
- Multiply2X:此模式类似于传统的细节纹理,其中灰色的反照率(Albedo)值是正常值,较低或较高(白色或黑色)的值会使纹理变暗或变亮。法线也会混合。
- Alpha Blend:此模式在图层之间进行传统的Alpha混合。
- Height Blend:当高度混合时,Albedo Texture的alpha通道的高度图被用来解决混合,这样以便较低的表面在较高的表面之前被覆盖。这可以产生流沙在岩石表面掠过的物理效果。
一旦您选择了如何混合纹理图层,您可以使用各种技术来确定纹理图层将显示在哪里。
Noise
噪声
每个层都有自己的噪声函数,这让你可以根据设置中定义的噪声类型来修改纹理层的权重。上面的例子中,基于这个噪声函数在墙上混合了一个损坏的纹理,它会根据墙在关卡中的位置而变化,使得每堵墙都有独特的损坏标记。在这里,两个纹理基于噪声函数进行高度混合,而且使用了色彩调整功能在过渡区域周围将砖块变黑。无论这堵墙在关卡中的哪个地方被使用,都会根据这个噪声函数应用独特的损坏效果。
Layer Noise
当启用层噪声时,你可以设置其频率(Noise Frequency)、振幅(Noise Amplitude)和偏移(Noise Offset)。噪声中心(Noise Center)值可以用来增加或减少噪声,这在你想要使用低振幅的噪声来产生大量的变化时非常有用,因为你会想要使用噪声中心来控制噪声的总量。
Layer Blend Tint会在噪声最接近0.5的区域(即过渡区域的中间)对层应用一种颜色。在上面的例子中,这使得许多砖块变暗,提供了一种更加损坏的外观和纹理之间独特的混合。
Angle Height filters
在这里,我们看到一层苔藓出现在岩石的上。这是通过启用Angle/Height Filter并使用图层的alpha blend模式来实现的。
当启用此功能时,您可以根据先前图层的高度字段、顶点法线和像素法线来过滤纹理图层出现的位置。
- Layer Angle Minimum(层角度最小值):此项基于斜率控制过滤器。
- Layer Vertex -> Normal Filter(层顶点 -> 法线过滤器):此项控制斜率是基于顶点法线还是下面层(Layer)的像素法线。在0时,它只会使用平滑的顶点法线,但在1的时候,它会使用下面一层的最终世界法线,这将给予对层出现位置的更精细的控制。
- Layer Height Filter(层高度过滤器):这让你可以通过前面层的高度来过滤层的不透明度。在这个例子中,我们正在过滤高度场中较低的区域。
- Layer on:我们可以翻转过滤器,只显示高度过滤值以上或以下的区域。
- Layer Contrast:层对比度控制过滤器如何快速地在无权重和最大权重之间插值。
Distance Fade
距离淡出可以根据图层与摄像机的距离来淡入或淡出图层。这可以用于多种效果,如距离重采样(Distance Resampling,AKA混合-AKA Mix Mapping),或者在很远的距离上引入全局细节。
- Start Fade(开始淡出):这是开始权重开始交叉淡入结束权重的距离。
- Start Weight(开始权重):图层应该比开始淡出距离更近的权重。(当图层的位置比"开始淡出"的距离更近时,应该使用的权重值。这个权重值会影响图层的显示效果。"权重"可以理解为图层的透明度或可见度,值越大,图层的可见度越高。)
- Fade Range(淡出范围):交叉淡入结束权重需要多少个单位的量。
- End Weight(结束权重):图层在淡出范围之外的权重。
综合应用
请注意,可以在一个表面上组合所有的过滤方法 - noise、weight maps、angle or height filtering、distance fades
。再加上混合模式和最多3层的额外纹理,这为程序纹理和效果提供了强大的工具集。
随机采样
就像主层一样,每个纹理层都可以进行随机采样,以防止出现平铺现象。
位移量(Displacement Amount)
当启用Tessellation(曲面细分)时,每一层也可以有一个位移量。例如,如果你在混合沙子和石头的高度,你会希望两个高度场都被同样地位移,当沙子覆盖岩石时,会产生一个交互的表面。然而,如果你在墙上添加一些程序化的污渍,或者在岩石上添加苔藓,你可能不希望那样调整表面的位移。
Effects
Wetness
湿度
湿度模式可以设置为关闭(off)、本地(local)或全局(global)。当设置为全局时,不会显示湿度量滑块,则是通过来自Eniro、Weather Maker或您自己的代码的全局着色器属性设置的。
Shader.SetGlobalVector("_Global_WetnessParams", new Vector2(wetnessMin,
wetnessMax));
在local模式下,所有的一切都通过材质设置来控制。Surface porosity 影响了水的反射性。想象一下当岩石表面湿润时的样子——它会变得相当暗淡,并且在适当的角度下具有反射性,因为小水滴在粗糙的表面形成了小镜子。然而,光滑的表面,比如塑料,几乎不会变暗,因为水直接从表面滚落下来。最小和最大湿度可以用来限制表面接收的湿度的最小或最大量。最后,湿度衰减(wetness falloff)和角度(angle )让你可以过滤物体,使其底部不会变湿。
Puddles
水坑(Puddles)模式也提供了本地(local)或全局(global)控制,允许天气系统通过一个着色器全局属性来修改水坑:
Shader.SetGlobalVector("_Global_PuddleParams", new Vector2(amount, 0));
水坑可以根据角度过滤,也可以通过噪声函数放置。雨滴也可以启用,并且当设置为全局时也响应shader全局。
Shader.SetGlobalVector("_RainIntensityScale", new Vector2(intensity,size));
Snow
像湿度(Wetness)一样,雪在本地和全局模式中都是可用的。当处于全局模式时,雪的数量由Enviro或Weather maker控制,或者通过一个全局着色器属性控制:
Shader.SetGlobalFloat("_Global_SnowLevel", snowAmount);
Wind
风效果可以营造出粒子在你的表面上下左右吹动的错觉。它可以与高度场进行交互,或者根据世界高度或角度进行过滤。
在这个曲面细分着色器(Tessellation Shader)上,我们看到风会掠过山顶(风被从高度图的较高海拔处过滤出来)。
Trax
一旦启用Trax,任何渲染到Trax缓冲区并与表面碰撞的对象都会融入到你提供的一个纹理层中。纹理是在世界空间中自上而下投影的,与Trax缓冲区一起。这也适用于曲面细分,允许你在表面上刻出物理轨迹。虽然Trax最初是作为MicroSplat插件设计的,但这允许你在任何使用Better Lit着色器的表面上使用Trax,stackable可以与Better Shaders一起使用,以支持Trax的方式编写你自己的着色器。不需要使用或者安装MicroSplat,只需要Trax模块。
Dissolve
溶解效果可以让你的物体溶解,完整的带有一个彩色化或者发光的边缘。
参数名称 | 作用 |
---|---|
Texture | 溶解噪声纹理,通道较低的值会优先溶解 |
Gradient | 渐变纹理,控制了溶解边缘的颜色化 |
Amount | 值从0到1会使物体从实体过度到完全溶解 |
Colorization | 控制了渐变纹理的作用程度 |
Contrast | 控制了边缘的宽度 |
Emissive Strength | 控制了发光亮度 |
Tessellation
当使用曲面细分时,存储在Albedo texture的alpha通道中的高度图被用来确定表面是如何被位移的。你可以通过Displacement来增加或减少这种效果,或者通过Offset属性来向上或向下偏移它。
你可以设置曲面细分是基于距离(Distance)还是边长(edge)。
当设置为边(edge)时,Min Edge Length控制在一个三角形被细分之前,其边缘应该有多小的像素。在距离(Distance)模式下,你可以得到一个距离(Fade Start/Falloff),在这个距离处,曲面细分应该达到最大,而在这个距离之后,就不应该再进行曲面细分了。Max Subdivisions控制一个三角形可以被细分的最大次数。Mip Bias允许查看较低的mip map level的位移-这不仅更快,而且通常比使用最高的mip级别产生的结果更少抖动,因为最高的mip级别可能包含比曲面细分可以表示的更小的细节。
总的来说,当曲面细分创建了大量的微小三角形时,它变得非常耗费性能—个小于10像素的三角形对GPU来说绘制的成本呈指数级增长,所以无论是否进行曲面细分,最好保持三角形的大小在这个值以上。
请注意,如果法线和顶点没有合并,曲面细分会分裂开一个网格。这可以通过在顶点数据不共享的区域中减弱曲面细分来缓解。一个预处理器可以用来处理网格,并在UV坐标的z通道中存储减弱数据。
要处理一个网格,打开Window/BetterLitShader/Crack Free Tessellation Mesh Processor窗口。从项目窗口拖动一个游戏对象到游戏对象设置中,然后按下处理。这将在你原来的游戏对象旁边保存一个新的Asset,扩展名为_crackfree,以及在该游戏对象内部找到的所有网格。然后你需要用新的网格替换场景中或预制件上的网格。
请注意,这只是在那些区域减弱了位移,这可能适合也可能不适合你特定的使用场景。例如,这在一个未细分的盒子上可能效果不佳,因为在未共享的顶点之间没有顶点可以位移。但是对于像岩石这样的有机形状,效果非常好。
Bakery
Better Lit着色器完全支持Bakery,这是一个用于Unity的GPU光照贴图工具,它提高了光照贴图的速度和质量。
Performance
着色器的性能高度依赖于哪些特性是激活的。启用triplanar或随机是两个最消耗性能的效果代价很高,因为它们需要对每个纹理进行多达3次的采样。请注意,你可以修改着色器实际采取的样本数量。
在界面的底部,你可以找到调试模式。当这个设置为Sample Count,着色器会根据采样的数量来给物体上色。当着色器采样多于调试样本阈值时,它会用红色进行绘制。如果低于调试样本阈值,它会用蓝色进行绘制。这不仅让你看到确切的采样数量,还可以可视化某些优化正在发生的地方。
在这里,我们看到了一个启用了随机采样的墙。在红色区域,着色器每像素进行6次或更多次的采样,而在蓝色区域,它进行5次或更少次的采样。当你调整stochastic scale和contrast设置时,你可以看到这是基于当前剔除进行调整的。
请注意,目前,只有triplanar、stochastic和snow areas在不使用时被剔除。这是因为这些区域往往有大面积的优化,使得dynamic flow比sampling textures更快。
Modifying the shaders
Better Lit着色器是使用Better Shaders编写的。Better Shaders允许你以非常简单的方式编写复杂的着色器,然后在任何渲染管线中使用它们。它还允许你将各种效果堆叠或继承到现有的着色器中,使编写的着色器更加的模块化。例如,包括的湿度、苔藓和雪效果只是堆叠在基础着色器之上,并且可以轻易地应用到任何Better Shader的着色器上,甚至不需要修改源代码。此外,纹理层是相同的着色器堆叠在点亮着色器之上三次。
此外,用Better Shaders编写的代码只需要手动编写的顶点/片段着色器的一小部分,而Unity的着色器几乎需要完全重写才能在另一个渲染管线上运行,而且还需要为URP/HDRP的不同版本重写,因为它们通常需要对着色器进行大量重写以实现兼容性。Better Shaders不仅为你处理所有这些,而且还包括一个打包系统,所以你可以在同一个系统上安装生成的着色器,并让它正常工作,无论他们安装了哪个渲染管线。