如果我们将物理性渲染(PBR)的材质信息压缩到单张纹理贴图上,再将其分层压制成一个紧凑的着色器,就能在不牺牲图形质量的情况下提高着色器的运行效率。一起来了解一下这个实验吧。
本次实验适用于通用渲染管线(URP)与高清渲染管线(HDRP),掌握 Shader Graph 知识将有助于理解文中知识。不熟悉 Shader Graph 的可前往了解工具的介绍及详细的着色器可视化编写教程。
Shader Graph 介绍:
https://unity.com/cn/shader-graph
着色器可视化编写教程:
https://docs.unity3d.com/Packages/com.unity.shadergraph@10.4/manual/index.html
在为地形类的环境挑选美术资产时,可平铺(tileable)材质通常由于其较好的混合效果而成为首选。然而,多纹理采样的 GPU 性能成本,以及在着色器中增加的每个层级都会提高内存的占用,这成了横亘在低端设备与高性能面前的大山。
本次实验的目的在于:
实现着色器的事半功倍
在表现PBR材质时,尽量节约针对纹理的采样操作,减少内存的占用
尽量减少着色器指令的使用数
使用最少的splatmap/vertex color(顶点颜色)通道完成图层混合
拓展splatmap/vertex color功能来制作锦上添花的效果
虽然实验总体上取得了成功,但仍存在一些缺陷,请大家根据自己的项目需求来进行取舍。
单纹理PBR材质
在材质层叠前,我们首先要搞清 PBR 材质的成分。PBR 材料通常带有 Albedo(Base Color,基本色)漫反射贴图、Smoothness(平滑度)遮罩、Ambient Occlusion(环境光遮蔽)、Metalness(金属性)和Normal(法线)参数贴图。
一般来说,五张参数贴图会表示为三张纹理贴图。而为了最小化纹理占用,我决定舍弃 Metalness 与 Ambient Occlusion。
而剩下的 Albedo、Smoothness 与 Normal 贴图按惯例将表示为两张纹理贴图,若要将其简化为单张贴图,我们需要预先处理下每个通道。
PBR 材质最终打包而成的单张纹理
红:Normal Definition# 的 dHdu(U 方向的派生高度/高度导数)。
绿:Normal Definition# 的 dHdv(V 方向的派生高度/高度导数)。
蓝:表示 Albedo(着色器重现的色彩)的线性灰度着色图。
Alpha:线性平滑度贴图(标准的平滑度贴图)。
注:纹理导入 Unity 时未采用 sRGB,压缩格式为 BC7。在接入其它平台时,纹理将转换为对等的 4 通道纹理格式。
贴图处理
01Albedo 贴图
反照率通常被定义为一张 RGB 纹理;但类似岩石、沙子、泥土、草地等地形材质的色彩范围极其有限。我们可将 Albedo 存为一张渐变灰度图,再到着色器中重新映射色彩,来达到精简纹理的目的。
RGB Albedo 贴图转换到渐变灰度图的方法并没有定式。这里,我选择性地遮挡了原 Albedo 与 Ambient Occlusion 通道,生成了一张灰度 Albedo 贴图;在着色器中还原鲜艳色彩时,我用肉眼进行了观察与调整。
Alebdo 色彩重现的时候,亮色与暗色上色时采用了梯度对比度调整。
02平滑度贴图
平滑度是 PBR 材质定义的一个关键部分,其作用是精确地定义平滑度,因此它有自己独立的通道。
这里我为平滑度添加了一个乘数,用以形成材质的变化。
你可以选择屏蔽平滑度乘数来减少所使用的着色器指令数
03法线定义贴图
法线贴图对于显示表面的细节特征非常重要。常见的 PBR 材料使用的是正切法线贴图(tangent space normalmap)。而这里,出于以下原因,我使用了表面渐变框架下预先转换好的 Derivatives(派生/导数)贴图。详情请见 Morten Mikkelsen 的表面渐变框架(点击回看)。
要将正切法线贴图转换成派生/导数贴图,请使用这份 Photoshop 动作文件。
Photoshop 动作文件:
https://drive.google.com/file/d/1X8VNnw7Dpv20xkTUjevQPM6KIKgzLuIs/view
预先转换好的派生/导数贴图具备几种优点:
可直接转换乘表面梯度,指令数较标准正切法线贴图更少,并免去了在着色器中的导数换算。
可储存至两个通道中(dHdu 与 dHdv),减少运行时的内存占用与纹理缓存量。
免去了正切法线贴图处理中常见的蓝色通道重建,表面梯度框架将负责法线重建(着色器指令数更少)。
支持在 Photoshop 中修改贴图,包括图像混合、遮挡及强度调整,修改后无需重新计算法线。比如,在贴图中混入 RGB(128,128,0)颜色可降低效果强度。
除此之外,再加上表面梯度框架的优点:
法线凹凸信息在着色器中的混合与组合与 albedo贴图相同。
凹凸属性数值的增加、减少与反转运算更轻巧、结果更精确。
但正切法线贴图提前转换而来的导数也有一些缺点:
需要用 Photoshop 转换,法线定义的值为了平衡 8 位纹理精确性而通常被限制在 45 度角以上。
正切法线贴图已被广泛接受,工作流中多一步 Photoshop 操作比较不便。
注:角度的限制(必须大于 45 度角)并不存在于着色器导数转换中。
根据不同的使用情况,角度限制的影响也会不同。在本次实验中,法线角小于 45 度不会对最终结果产生明显的负面影响,极端法线角的消失甚至消除了错误的反射信息。
预转换派生贴图纹理与正切法线贴图纹理的比较。
预转换派生贴图与正切法线贴图压力测试下的对比。注意由于派生贴图 45 度角的限制,突起的曲面上出现了一些瑕疵。
将派生贴图转换为表面梯度的图表。
注:Master 堆栈的 Normal 仅接收场景空间(world space)法线,不接收正切空间(tangent normal)法线。
04完整解包流程
这个 Sub Graph 会将 PBR 压缩纹理输出为彩色 Albedo、平滑度与表面梯度贴图。
注:为了方便混合 UnpackedSubGraph 的输出材质,表面梯度到法线的转换并非由该 Sub Graph 完成。
解包后的着色器材质。
角度各异的材质在光照下的表现。
材质层叠
在本次实验中,我在单通道重映射上采用了层级式层叠方法。Sub Graph 会执行五次插值运算(外加一层基本层,共 6 层)。
图层权重有多种混合方法,而我的方法比较简单,只需使用一个矢量输入,符合实验目的。方法可支持大量层级,且不会在多个 splat map 通道或节点通道上占用大量资源。
方法的缺点在于无法控制单个图层属性的权重,混合效果将始终以上一层为基础,这些在特定情况下会成为缺陷。
上方 Sub Graph 可用 6 个图层来重新映射一个通道。
该 Sub Graph 根据 6 图层层级混合方法编写完成。如果要创建新图层,请将层级数减 1,除 1,再根据值范围重新映射每个层级。
例如,由 9 个层级混合而成的材质其每个层级的重映射范围为 1/(9-1)= 0.125。
层级
最小值
最大值
1
0
0.125
2
0.125
0.25
3
0.25
0.375
4
0.375
0.5
5
0.5
0.625
6
0.625
0.75
7
0.75
0.875
8
0.875
1
注意通道的除数(层级数)越多,着色范围也就越小。
使用彩色图层测试层叠方法,展示混合效果的特点。
在单个顶点颜色通道(红色通道)中组成 6 个图层的材质。
注:在 Shader Graph 中混合一个分层 PBR 材质要比混合三个 PBR 材质简单。
而图层混合使用的层级最好在混合之前就排好序。
材质功能拓展
图层混合只使用了一个通道(红色顶点通道),而剩下的三个顶点通道则能用于额外的功能。
最终版 Shader Graph 会利用余下的顶点通道来生成最终结果。
在本次实验中,顶点绘制使用了 Polybrush(可在 PackageManager 中下载)在 Unity 中完成。
建议使用的着色器顶点绘制色板。
红色:用于为图层属性设置权重。
红色顶点通道绘制演示
绿色:设置表面梯度属性,可增加、降低突起属性(值被重映射为 -1 到 1)。
0 将反转法线突起属性(变为 -1)
0.5 将抹平法线突起属性(变为 0)
1 将取法线突起属性的原值(变为 +1)
绿色顶点通道绘制演示
蓝色:控制平滑度与表面梯度突起属性的比例来形成水面般的光泽表面。
0 为不变
255 为最大化平滑度与法线贴图平整效果(光泽表面)
蓝色顶点通道绘制演示
Alpha:控制 Alebdo 图层的权重,将基本色设为白色,并根据法线 y 轴数值形成图层属性。通道并不会改变图像平滑度,以原始表面图层平滑度与突起属性作为渲染基础。
0 为无积雪
255 为厚重的积雪
Alpha顶点通道在前几个通道上的绘制,注意底部图层与雪花的关系。
各顶点通道绘制而成的最终结果:
你可以根据自己的项目需求自行调整着色器混合方法,及各顶点通道 /splat map 的功能。
性能比较
本次实验的目的在于扩展 Shader Graph 功能、最小化资源占用。那么纹理经过预处理和解包后运行时的效率是否有提升呢?
性能分析显示了所有努力带来的结果。
我创建了一个标准的 6 层级混合着色器来与优化后的着色器进行比较。两个着色器使用了相同的混合方法制作,两者主要区别在于标准着色器使用了三张不同的纹理来表示单个图层。
在分析时,我使用了通用渲染管线在目标平台的屏幕上渲染出了单个混合材料网格。
01移动端内存与性能分析
移动端(安卓)纹理压缩:
移动端 1024x1024 的标准 PBR 材质,其 Albedo、遮罩与法线贴图大小为:
6x ASTC 10x10 的 Albedo 贴图为 6x 222.4 KB
6x ASTC 8x8 的遮罩贴图为 6x 341.4KB
6x ASTC 8x8 的法线贴图为 6x 341.4KB
纹理总内存占用为5.431MB。
移动端 1024x1024 的压缩 PBR 材质大小为:
6x ASTC 8x8 的 PackedPBR 纹理为 6x 341.4KB
纹理总内存占用为2.048MB。
六图层压缩材质在移动端(安卓)上节省了超过 62%的纹理内存占用,总大小节省超过一半。
安卓移动端 /Adreno630(骁龙 845)下的 Vulcan;骁龙处理器分析的结果为:
运行时内存读取减少了约 70%。
标准材质需要 9971020 频次(clock)渲染。
压缩材质仅需 6951439 频次(clock)渲染。
压缩材质在屏幕上的渲染速度快了约 30%。
骁龙分析器的分析结果
02PC 端内存与性能分析
1024x1024 的标准 PBR 材质,其 Albedo、遮罩与法线贴图大小为:
6x DTX1 的 Albedo 贴图为 6x 0.7 MB
6x DTX5 的遮罩贴图为 6x 1.3 MB
6x DTX5 的法线贴图为 6x 1.3 MB
纹理总内存占用为19.8MB。
1024x1024 的压缩 PBR 材质:
6x BC7 的 PackedPBR 纹理为 6x1.3 MB
纹理总内存占用为7.8 MB。
六图层压缩材质在 PC 端上节省了 60%的纹理内存占用,节省超过一半。
搭载 Radeon 460 Pro 的笔记本以 2880x1800 渲染,RenderDoc 的分析结果为:
绘制标准 6 图层混合材质的 Opaque 图像:5.186 ms。
绘制压缩 6 图层混合材质的 Opaque 效果:3.632 ms。
压缩材质在屏幕上的渲染要快约 30%( *RenderDoc 分析结果会上下波动,30% 为样本平均值)。
搭载 NVIDIAGTX 1080 的 PC 端以 2560x1440 渲染,nSight 分析结果:
渲染标准 6 图层材质的 Opaque 图像:0.87 ms。
渲染压缩 6 图层材质的 Opaque 图像:0.48 ms。
压缩图像在屏幕上的渲染速度要快约 45%。
nSight 分析结果图示
03主机性能分析
在 PlayStation 4 上,压缩材质可节省 60%的内存,其与 PC 端的压缩格式是一样的。
在 PS4 上以 1920x1080 渲染,Razer 分析结果为:
渲染标准 6 图层材质的 Opaque 图像:2.11 ms。
渲染压缩 6 图层材质的 Opaque 图像:1.59 ms。
压缩材质在屏幕上的渲染时间要快约 24.5%。
PS4 Razor 分析器的分析结果
总的来说,压缩 6 图层 PBR 着色器能提高一定的性能、大量降低内存占用。不同的 GPU 会有不同的表现,因为材质的解包比纹理采样占用的 ALU(算术逻辑单元)更多。
示例项目下载
文中的 Shader Graph 与 Sub Graph 项目可在此处下载:
装有 HDRP 10.3.1 的 Unity 2020.2.5f1:
https://drive.google.com/file/d/1Y4jgOo9EvAFL7qpzNyPVJOPcTXLpuM1t/view
装有 HDRP 10.3 的 Unity2020.2.5f1:
https://drive.google.com/file/d/1Z1Yz1MepSNag2LgqIRZeLveFO3SQ5iI2/view
将正切法线贴图转化为派生/导数贴图的 Photoshop 动作文件:
https://drive.google.com/file/d/1X8VNnw7Dpv20xkTUjevQPM6KIKgzLuIs/view
总结
项目在通用渲染管线下的截图
本次实验的主要组成为:
自定义材质的 Shader Graph
预先转换好的派生/导数贴图
表面梯度框架
Albedo 色彩重建器
单通道图层混合
UpVector 混合技术,通过混合顶点通道而实现的平滑度与突起控制
本次实验演示了如何使用 Shader Graph 生成美观又高效的图形,希望能帮助各位美术与开发者进一步推进 Unity 项目的美学边界。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.