尝试使用着色器图形少花钱多办事

通过将基于物理的渲染 (PBR) 材质信息打包到单个纹理贴图中,并将其分层到一个紧凑的着色器中,可以提高着色器的运行效率,而不会影响图形质量。看看这个实验。
该实验在通用渲染管道(URP)和高清渲染管道(HDRP)中均可进行。要从本文中获得最大的收获,你应该对着色器图形有一定的了解。如果您是 Shader Graph 的新用户,请浏览我们的资源,了解有关该工具的介绍和更多详细信息,以便以可视化方式编写着色器。
在类似地形的环境中处理艺术资产时,通常首选多层可拼贴材质,因为它们能产生更好的混合效果。然而,对于某些设备来说,多重纹理采样所带来的 GPU 性能成本,以及每添加一层着色器所带来的内存使用量增长,都会让人望而却步。
通过这项实验,我的目标是
- 少花钱多办事
- 在表现 PBR 材质时,尽量减少内存占用并节省纹理采样的成本
- 最小化着色器指令
- 使用最小的拼接贴图/顶点颜色通道执行图层混合
- 扩展飞溅贴图/顶点颜色的功能,提供额外的功能和口哨声
虽然实验达到了目的,但也有一些注意事项。你必须根据自己项目的要求确定优先事项,以确定哪些取舍是你可以接受的。
在分层之前,首先要弄清楚 PBR 材料的包装。PBR 材质一般都定义了反照率(基色)、平滑度遮罩、环境遮蔽、金属度和法线参数。
通常,所有五个贴图都由三个纹理贴图来表示。为了尽量减少纹理的使用,我决定在这次实验中牺牲金属感和环境遮蔽。
其余的贴图--反照率、平滑度和法线定义--传统上至少由两个纹理贴图来表示。要将其缩减为一张地图,需要对每个通道进行一些预处理。

PBR 材质最终打包成一个纹理。红色= dHdu(相对于 U 方向的衍射高度),用于法线定义#。绿色= dHdv(相对于 V 方向的衍射高度),用于法线定义#。蓝色= 代表反照率的线性灰度阴影(在着色器中重建的颜色)。Alpha= 线性平滑度图(标准平滑度图)。请注意:纹理导入 Unity 时未选中 sRGB,并以 BC7 格式压缩。移植到其他平台时,请切换到平台支持的等效 4 通道纹理格式。
处理地图
反照率
反照率通常被定义为 RGB 纹理;但是,许多类似地形的材料(岩石、沙、泥、草等)只有有限的调色板。您可以将反照率存储为灰度渐变,然后在着色器中对其进行颜色重映射,从而利用这一特性。
没有将 RGB 反照率转换为灰度梯度的固定方法。在本实验中,灰度反照率是通过选择性屏蔽原始反照率贴图通道和环境闭塞创建的;为了与着色器颜色重构中的突出颜色相匹配,只需目测任何手动调整即可。

光滑度
平滑度对于 PBR 材料的定义非常重要。为了更准确地定义平滑度,它有自己的通道。
在着色器中为平滑度添加了一个简单的乘数,以便在材质中产生一些变化。

正常定义
法线图对于显示表面的详细特征非常重要。典型的 PBR 材质使用切线空间法线贴图。在本实验中,我选择了使用表面梯度框架进行预转换的导数图,原因如下。(更多信息,请参阅莫顿-米克尔森的表面梯度框架)。
要将切线空间法线贴图预先转换为导数,请使用此Photoshop 操作。
使用预先转换的衍生地图有几个优点:
- 可直接转换为表面梯度,与需要在着色器中进行导数转换的标准切线空间法线贴图相比,使用的指令更少
- 可存储在两个通道(dHdu 和 dHdv)中,从而降低了运行时对内存和纹理缓存的占用
- 不需要在着色器中进行蓝色通道重构,这在处理切线空间法线映射时很常见,因为曲面梯度框架会处理法线重构(减少着色器指令)。
- 在 Photoshop 中进行调整(即通过混合、遮罩或降低强度)时可正常工作,且无需重新规范化。例如,要降低强度,只需将贴图与 RGB(128,128,0)混合即可。
结合表面梯度框架,其优势还包括
- 在着色器中混合和合成法线凹凸信息的方法与反照率混合/合成的方法相同,结果也是正确的。
- 增加、减少和逆转凹凸贡献是微不足道的,也是准确的。
但从切线空间法线贴图预先转换的导数也有一些缺点:
- 通过 Photoshop 转换,法线定义被夹在一个大于 45 度的角度,以平衡 8 位纹理的精度。
- 艺术家们习惯使用切线空间法线贴图,并要求在工作流程中通过 Photoshop 对贴图进行预转换。
请注意:夹角大于 45 度不适用于基于着色器的导数转换。
根据您的使用情况,限制可能会产生或大或小的影响。在本实验中,法线方向小于 45 度不会对最终结果产生明显的负面影响。事实上,在这种情况下,它还能减少来自极端法线方向的不必要反射。





完整的拆包过程



在这次实验中,我选择了在单通道重映射上基于层级的分层方法。子图形进行了五次线性插值(加上基数,形成六层)。
混合图层权重的方法有很多种。这种方法具有单一矢量输入的简单性,符合实验目标。这样就可以进行大量分层,而不会烧毁溅射贴图或顶点通道中的多个通道。
这种方法的缺点是无法控制单个图层的贡献权重。混合效果将始终是上一层的过渡。与传统的按通道混合相比,这可能是一个限制因素,具体取决于使用情况。




图层混合只需要一个通道(红色顶点通道)。其余三个顶点通道提供额外的功能。最后的着色器图形使用剩余的顶点通道生成结果。
在本实验中,顶点绘制是在 Unity 编辑器中使用 Polybrush(可从软件包管理器中获取)完成的。建议用于此着色器的顶点颜料调色板。
红色用于加权图层贡献。红色顶点通道绘画演示
绿色设置曲面梯度属性,用于翻转、减少或增加法线凹凸贡献(重映射为-1 和 1)。
- 0 则反转正常凹凸 (-1)
- 0.5 的值将正常凹凸归零 (0)
- 1 将正常凹凸设置为原始值 (+1)。
绿色顶点通道绘画演示
蓝色控制平滑度和表面渐变凹凸比例,打造湿水效果
- 0 = 无改动
- 255 = 最大平滑度和平面法线贴图(湿润效果)
蓝色顶点通道绘画演示
阿尔法控制反照率图层的权重,将基色设置为白色,并根据表面法线的 y 轴来计算权重。它不会改变光滑度,并利用了原有表面层的光滑度和凹凸特性。
- 0 = 无雪
- 255 = 实雪
阿尔法顶点通道绘画与之前的通道相结合,展示了整个图层如何与雪地互动
不同顶点绘制通道的综合结果:
您可以根据项目要求调整着色器混合方法以及各种顶点通道/贴图功能的设置。
本实验的目的是在最大限度减少资源的同时,扩展着色器图形的功能。纹理经过预处理和解包,但运行时的效率是否会有所提高?
性能剖析显示了这些努力所产生的效率。
为了与紧凑型六层混合着色器进行比较,我们创建了一个标准的六层混合着色器。这两种着色器都是使用相同的混合方法创建的,具有相同的功能。主要区别在于,标准着色器使用三种不同的纹理来表示一个图层。
为了进行剖析,使用目标平台中的通用渲染管道在屏幕上用混合材料渲染了单个网格。
移动存储器和性能简介
手机(安卓)纹理压缩:
带有反照率、遮罩和法线贴图的标准 PBR,移动分辨率为 1024x1024:
- 6x Albedo map ASTC 10x10 = 6x 222.4 KB
- 6x 掩码图 ASTC 8x8 = 6x 341.4 KB
- 6x 正常地图 ASTC 8x8 = 6x 341.4 KB
纹理内存总用量 5.431 MB
适用于移动设备的 1024x1024 紧凑型 PBR:
- 6x PackedPBR Texture ASTC 8x8 = 6x 341.4 KB
纹理内存总用量 2.048 MB
由于采用了紧凑型六层材料,移动设备(安卓)上的纹理内存消耗减少了约62%,节省了一半以上。配备 Adreno 630(骁龙 845)的移动安卓/Vulcan; 骁龙配置文件结果:
- 运行时读取的纹理内存减少约 70%。
- 标准渲染耗时 9971020 个时钟。
- Compact 的渲染耗时 6951439 个时钟。
紧凑型材料在屏幕上的渲染速度提高了约30%。来自 Snapdragon Profiler 的剖析结果。
电脑内存和性能简介
使用反照率、遮罩和法线贴图的标准 PBR,分辨率为 1024x1024:
- 6x Albedo map DTX1 = 6x 0.7 MB
- 6x 掩码图 DXT5/BC7 = 6x 1.3 MB
- 6x 法线贴图 DXT5/BC7 = 6x 1.3 MB 纹理内存总用量 19.8 MB
1024x1024 的紧凑型 PBR:
- 6x PackedPBR Texture BC7 = 6x 1.3 MB
纹理内存总用量 7.8 MB
这种紧凑型六层材料在 PC 上 使用的纹理内存消耗量减少了 60% (节省一半以上)。
配备 Radeon 460 Pro 的 PC 笔记本电脑以 2880x1800 渲染; RenderDoc 配置文件结果:
- 绘制标准 6 层混纺的不透明色:5.186 毫秒。
- 绘制不透明图案,实现紧凑的 6 层混合:3.632 毫秒。紧凑型材料在屏幕上的渲染速度大约快 30%*。*RenderDoc 配置文件值会波动;30% 是样本的平均值。
使用 nVidia GTX 1080 在 2560x1440 下进行渲染的 PC 台式机; nSight 配置文件结果:
- 渲染不透明效果,用于标准 6 层材料:0.87 毫秒
- 为紧凑型 6 层材料渲染不透明效果:0.48 毫秒
紧凑型材料在屏幕上的渲染速度提高了约45%。nSight 的剖析结果。
控制台性能简介
在 PlayStation 4 上,使用紧凑型材料可节省 60% 的内存,这与 PC 上的情况相同,因为PS4 采用了相同的压缩方式。
PS4 基础渲染,1920x 1080; Razer 配置文件结果:
- 渲染不透明效果,用于标准 6 层材料:2.11 毫秒
- 为紧凑型 6 层材料渲染不透明效果:1.59 毫秒
紧凑型材料在屏幕上的渲染速度提高了约24.5%。
PS4 Razor 剖析器的剖析结果。
总之,使用紧凑型六层 PBR 着色器不仅能提高性能,还能显著节省内存。GPU 性能的变化很有趣,但也在意料之中,因为解压缩材料比采样更多纹理要消耗更多的 ALU。
可在此处下载包含着色器图形和子图形的示例项目:
[在此下载],Unity 2020.2.5f1 与 HDRP 10.3.1
[DOWNLOAD HERE], Unity 2020.2.5f1 with URP 10.3.1
[在此下载],将切线空间法线贴图预先转换为导数的 Photoshop 操作。
该项目的通用渲染管道版本截图。
该实验的主要内容包括
- 自定义材料着色器图
- 预转换衍生工具
- 表面梯度框架
- 反照率色彩重建
- 单通道图层混合
- UpVector 混合技术,通过顶点通道混合实现平滑度和凹凸控制
本实验展示了如何使用着色器图形制作既美观又高效的图形。希望这个例子能激励艺术家和开发人员在他们的 Unity 项目中突破美学界限。
Rinaldo Tjan(聚光灯团队研发部技术艺术总监)是一名实时三维艺术家,对实时照明和渲染系统有着极大的热情。
他的职业生涯始于 PlayStation 2 时代,拥有十多年从贴图到最终渲染场景制作的端到端艺术家工作流程知识。在加入 Unity Technologies 之前,他曾帮助开发 AAA 级游戏,如《生化奇兵 2》(BioShock 2)、《局内人》(The Bureau):XCOM 解密 ,以及《黑手党 III》。
目前,他与 Unity 客户合作,帮助他们使用 Unity 增强项目并实现真正的潜力,同时帮助推动 Unity 渲染功能的内部开发和标准。