该实验在通用渲染管道(URP)和高清渲染管道(HDRP)中均有效。为了充分利用本文,您应该对Shader Graph有所了解。如果您是Shader Graph的新手,请浏览我们的资源以获取
简介和有关此工具的
更多详细信息,以可视化方式创建着色器。
在类似地形的环境中使用艺术品资产时,通常首选多层可铺砖材料,因为它们会产生更好的混合效果。但是,多个纹理样本的GPU性能成本以及添加到着色器的每一层的内存使用量的增长对于某些设备可能是禁止的,并且通常效率低下。
分层之前,您需要做的第一件事就是弄清楚PBR材料的包装。PBR材料通常带有Albedo(BaseColor),Smoothness mask,Ambient Occlusion,Metalness和Normal定义的参数。通常,所有五个贴图都以三个纹理贴图表示。为了尽量减少纹理使用,我决定为此实验牺牲“金属度”和“AO”。
=表示反照率的线性灰度阴影(在着色器中重建的颜色)。
=线性平滑度贴图(标准平滑度贴图)。
注意:无需导入sRGB即可将纹理导入到Unity中,并以BC7格式压缩。移植到其他平台时,请切换到平台支持的等效4通道纹理格式。
反射率通常定义为RGB纹理;但是,许多类似地形的材料(岩石,沙子,泥土,草等)包含有限的调色板。您可以通过将Albedo作为灰度渐变存储,然后在着色器中对其进行颜色重映射来利用此属性。
没有将RGB反照率转换为灰度渐变的固定方法。在本实验中,通过对原始Albedo地图通道和环境光遮挡进行选择性遮罩来创建灰度Albedo。要与着色器颜色重建中的突出颜色匹配,只需手动进行任何调整即可。高光和暗色,带有渐变对比度调整功能,用于Albedo重建。
光滑度
光滑度对于PBR材料的定义非常重要。为了更精确地定义平滑度,它具有自己的通道。对于材质的某些变化,在材质球的平滑度上添加了一个简单的乘数。(您可以选择跳过平滑度乘法器以减少着色器指令。)
普通定义法线贴图对于显示表面的详细特征很重要。典型的PBR材料使用切线空间法线贴图。在本实验中,出于以下原因,我选择了使用表面梯度框架进行预转换的导数图。(有关更多信息,请参见
Morten Mikkelsen的表面渐变框架)。要将切线空间法线贴图预先转换为导数,请使用此
Photoshop操作。
使用预先转换的导数图有几个优点:
- 可以使用比标准切线空间法线贴图更少的指令直接转换为表面渐变,这需要在着色器中进行导数转换
- 可以存储在两个通道(dHdu和dHdv)中,从而在运行时减少了内存和纹理缓存的占用
- 不需要在着色器中进行蓝色通道重建,这在处理切线空间法线贴图时很常见,因为曲面渐变框架可以处理法线重建(较少的着色器指令)
- 在Photoshop中进行调整后(即通过混合,遮罩或降低强度)可以正常工作,并且不需要重新归一化。例如,要降低强度,只需将贴图与RGB(128,128,0)混合即可。
结合表面渐变框架,优点还包括:
- 可以使用与反照率混合/合成相同的方式在着色器中混合和合成普通凹凸信息,并获得正确的结果。
- 增加,减少和逆转颠簸贡献是微不足道且准确的。
但是,切线空间法线贴图的预转换导数也有一些缺点:
- 使用Photoshop转换,法线清晰度将夹在大于45度的角度上,以平衡8位纹理的精度。
- 美工习惯于使用切线空间法线贴图,并要求将其作为工作流的一部分通过Photoshop进行预转换。
注意:以大于45度的角度夹紧不适用于基于着色器的派生转换。
根据您的使用情况,限制可能会或多或少地产生影响。在此实验中,法线方向小于45度不会对最终结果产生明显的负面影响。实际上,在这种情况下,它通过减少来自极端法线方向的不必要反射而提供了好处。
预转换导数贴图纹理和切线法线贴图纹理的比较。
预转换导数和切线空间法线贴图之间的压力测试差异。注意,由于预转换导数图中的45度钳位,球形凸块显示出一些伪像。
用于将预转换的导数映射重新映射到表面梯度的图。
注意:确保主堆栈片段法线空间接受世界空间法线,而不是默认的切线空间法线。
完整的拆包过程
完整的子图,用于解压缩Compact PBR纹理,以输出彩色的反照率,平滑度和表面渐变。注意:将表面渐变转换为法线是在子图的外部完成的,因此可以根据UnpackedSubGraph的输出轻松地混合材料。
从未包装的着色器中采样材料。
不同的角度可以更好地展示每种材料对光的反应。
2.分层材料在本实验中,我在单通道重映射上选择了基于层的分层方法。该子图确实五个直线内插(加碱,形成6层)。有很多混合图层权重的方法。该方法具有单个矢量输入的简单性,适合实验目标。这样就可以进行很多分层,而不会在splat贴图或顶点通道中的多个通道中燃烧。
这种方法的缺点是您无法控制单个图层的贡献的权重。混合将始终是上一层的过渡。与使用情况不同,与传统的每通道混合相比,这可能是一个限制因素。
的子图以重新映射的单个信道来表示六层。
上面显示的子图已针对六层基于层的混合进行了预定义。要创建更多层,请用1除以所需的混合层数,再减去1,然后根据该值范围重新映射每个层。例如,对于九层混合材料,每个层的重映射范围为1 /(9-1)= 0.125。
请注意,将单个通道分成较小的部分时,阴影范围较小。
使用颜色测试的分层方法展示了混合特性。
用于将6层未包装材料复合为单一顶点颜色(在这种情况下为红色通道)的材料。
注意:在Shader Graph中混合单个样品填充的PBR材料的层比混合三个PBR纹理更简单。由于图层混合是基于层的,因此在设置混合材料之前计划图层的顺序是一个好主意。
3.扩展材料的功能图层混合仅需要一个通道(红色顶点通道)。其余三个顶点通道提供了额外的功能。
最终的Shader Graph使用其余的顶点通道产生结果。
在本实验中,使用Polybrush(可从“程序包管理器”中获得)在Unity Editor中完成顶点绘制。
此着色器的建议的Vertex Paint调色板。
红色:用于加权图层贡献。
红色顶点通道绘画演示
绿色:设置表面渐变属性,以翻转,减少或添加法线凹凸贡献(重新映射为-1和1)。
- 0反转正常凹凸(-1)
- 0.5值会将正常凹凸(0)归零
- 1将正常凹凸更改为原始值(+1)。
绿色顶点通道绘画演示
蓝色:控制平滑度和表面渐变凹凸缩放,以创建湿润的外观
- 0 =无变化
- 255 =最大平滑度和平坦法线贴图(湿润外观)
蓝色顶点通道绘画演示
Alpha:控制Albedo图层的权重,将基础颜色设置为白色,其贡献基于表面法线的y轴。它不会改变平滑度,并利用了原始表面层的平滑度和凹凸特性。
Alpha顶点通道绘画与以前的通道相结合,以展示整个图层如何与雪交互
不同顶点绘制通道的合并结果:
您可以根据项目要求调整着色器混合方法和各种顶点通道/ splat贴图功能的设置。
4.比较性能该实验的目的是在最大限度地减少资源的同时扩展Shader Graph的功能。纹理已经过预处理和解压缩,但是运行时效率有回报吗?性能分析显示了这些努力所产生的效率。
创建了一个标准的六层混合着色器,以与紧凑的六层混合着色器进行比较。两个着色器都是使用具有相同功能的相同混合方法创建的。主要区别在于标准着色器使用三种不同的纹理来表示单个图层。为了进行分析,使用目标平台中的“通用渲染管道”在屏幕上使用混合材质渲染单个网格。
行动记忆体和效能设定档手机(Android)的纹理压缩:
适用于手机的标准PBR,具有Albedo,Mask和法线贴图,分辨率为1024×1024:
- 6x反照率 地图ASTC 10×10 = 6x 222.4 KB
- 6x遮罩 图ASTC 8×8 = 6x 341.4 KB
- 6x法线 贴图ASTC 8×8 = 6x 341.4 KB
纹理内存总使用量5.431 MB
适用于移动设备的1024×1024紧凑型PBR:
- 6x压缩的PBR纹理ASTC 8×8 = 6x 341.4 KB
纹理内存总使用量2.048 MB
凭借紧凑的六层材料,Mobile(Android)上的纹理内存消耗减少了约62%,节省了一半以上。 搭载Adreno 630(Snapdragon 845)的行动Android / Vulcan;金鱼草的个人资料结果:
- 在运行时读取的纹理内存减少了大约70%。
- Standard需要9971020时钟来渲染。
- Compact花了6951439个时钟来渲染。
紧凑的材料在屏幕上的渲染速度提高了约30%。
Snapdragon Profiler的分析结果。
PC内存和性能配置文件带有反照率,蒙版和法线贴图的标准PBR,分辨率为1024×1024:
- 6x反照率 地图DTX1 = 6x 0.7 MB
- 6x遮罩 图DXT5 / BC7 = 6x 1.3 MB
- 6x法线 贴图DXT5 / BC7 = 6x 1.3 MB纹理内存总使用量19.8 MB
紧凑型PBR,尺寸为1024×1024:
- 6x PackedPBR纹理BC7 = 6x 1.3 MB
纹理内存总使用量7.8 MB
紧凑的六层材料在PC上减少了60%的纹理内存消耗(节省了一半以上)。
具有Radeon 460 Pro渲染的PC笔记本电脑,分辨率为2880×1800;RenderDoc配置文件结果:
- 对于标准的6层混合绘制不透明:5.186毫秒。
- 紧凑的6层混合绘制不透明:3.632毫秒。紧凑的材料在屏幕上的渲染速度提高了约30%* 。* RenderDoc配置文件值波动;30%是样品的平均值。
具有2560×1440的nVidia GTX 1080渲染的PC桌面; nSight配置文件结果:
- 标准6层材料的渲染不透明:0.87毫秒
- 紧凑6层材料的渲染不透明:0.48毫秒
紧凑的材料在屏幕上的渲染速度提高了约45%。
从nSight分析结果。
控制台性能配置文件在PlayStation 4上,使用紧凑的材料可以节省60%的内存,与PC相同,因为PS4使用相同的压缩率。
PS4基本渲染为1920x 1080; 雷蛇的个人资料结果:
- 标准6层材质的渲染不透明:2.11毫秒
- 致密6层材料的渲染不透明:1.59毫秒
- 紧凑的材料可使屏幕显示速度提高约24.5%。
PS4 Razor分析器的分析结果。
总之,使用紧凑的六层PBR着色器可提高性能并显着节省内存。GPU性能的变化很有趣,但可以预料,因为拆开包装材料会比对更多纹理进行采样消耗更多的ALU。
下载示例项目带有着色器图和子图的示例项目可以在此处下载:
[
此处下载],带有HDRP 10.3.1的Unity 2020.2.5f1 [
此处下载],带有URP 10.3的Unity 2020.2.5f1。[在此
下载],Photoshop动作可将切线空间法线贴图预先转换为导数。
带走
该项目的Universal Render Pipeline版本的屏幕截图。
该实验的主要组成部分是:
- 自定义材质的明暗器图
- 预转换的导数
- 表面渐变框架
- 反照率色彩重建
- 单通道层融合
- UpVector融合技术,通过顶点通道融合的平滑度和凹凸控制
此实验展示了如何使用Shader Graph生成高效的精美图形。希望这个例子可以激发艺术家和开发人员在其Unity项目中突破美学界限。
关于作者Rinaldo Tjan(Spotlight团队研发技术总监)是一位实时3D艺术家,对实时照明和渲染系统充满热情。
在PlayStation上工作了两天后,他拥有十多年的端到端艺术家工作流程知识,从纹理制作到最终渲染的场景创建。在加入Unity Technologies之前,他帮助交付了AAA游戏,例如BioShock 2,The Bureau:XCOM Declassified和Mafia III。
他目前与Unity客户合作,以​​帮助他们扩大项目并使用Unity发挥其真正潜力,同时帮助推动Unity渲染功能的内部开发和标准。