由于着色器变体数量在不断的增加,播放器构建时间和数据大小会随着项目复杂度而增加。而通过允许开发人员控制Unity着色器编译器处理哪些着色器变体,并将其包含在播放器数据中,可大量减少播放器构建时间和数据大小。今天我们将为大家介绍Unity 2018.2 beta版中新功能可编程着色器变体移除功能。
可编程着色器变体移除功能允许开发人员移除所有包含无效代码路径的着色器变体、去除带有未使用功能的着色器变体,并创建着色器构建配置,例如“debug”(调试)和“release”(正式版),这些操作不会影响迭代时间或是复杂性的维护。
在本文中,首先会定义一些需要使用的术语。然后我们会关注于着色器变体的定义,解释为什么可以生成那么多变体。接下来,再介绍自动着色器变体移除功能,讲解可编程着色器变体移除功能在Unity着色器管线架构中的实现方法。之后,我们会介绍可编程着色器变体移除功能的API,讨论Fountainbleau演示项目中得到的结果,最后针对编写移除脚本提供一些技巧。
尽管学习可编程着色器变体移除功能并不简单,但这个功能却可以大幅提升团队效率。
下载示例项目
本文中的示例项目下载请访问: https://unity3d.com/unity/beta-download
注意:该项目需要使用Unity 2018.2.0b1。
基础概念与术语
为了理解可编程着色器变体移除功能,我们首先要准确理解一些相关概念。
• 着色器资源(Shader asset):着色器资源是个包含属性、子着色器、通道和HLSL代码的完整源代码文件。
• 着色器片段(Shader snippet):着色器片段是带有单个着色器阶段所有依赖的HLSL输入代码。
• 着色器阶段(Shader stage):着色器阶段是GPU渲染管线中的一个特定阶段,通常情况下是顶点着色器阶段(vertex shader stage)和片元着色器阶段(fragment shader stage)。
• 着色器关键字(Shader keyword):着色器关键字是个预处理标识符,用于在编译时跨着色器扩展分支。
• 着色器关键字集(Shader keyword set):着色器关键字的特定集合,用来识别特定代码路径。
• 着色器变体(Shader variant):着色器变体是通过Unity着色器编译器生成的平台专有着色器代码,变体会根据单个着色器阶段中的特定图形等级、通道、着色器关键字集等属性生成。
• 超着色器(Uber shader):超着色器是个可以生成多个着色器变体的着色器来源。
在Unity中,超着色器由多个部分管理,包括ShaderLab子着色器、通道、着色器类型,以及#pragma multi_compile和#pragma shader_feature这两个预处理指令。
计算生成的着色器变体的数量
要使用可编程着色器变体移除功能,我们需要对着色器变体这个概念有着清楚的认识,还要了解着色器变体是如何由着色器构建管线生成的。着色器变体的生成数量会与构建时间和播放器着色器变体数据量成正比。着色器变体是着色器构建管线的一个输出结果。
着色器关键字是生成着色器变体的一个重要因素。在使用着色器关键字时如果未经过仔细考虑,着色器变体计数可能会呈爆炸式增长,从而大大延长构建时间。
了解着色器变体的生成方法,可以查看下面这个简单的着色器代码,它会统计所生成的着色器变体数量。
Shader "ShaderVariantsStripping"
{
SubShader
{
Pass
{
Name "ShaderVariantsStripping/Pas