Unity3D:ShaderLab-指定包要求
推荐:将NSDT场景编辑器加入你的3D工具链
3D工具集:NSDT简石数字孪生
ShaderLab:指定包要求
某些着色器需要同时支持多个渲染管线。将包要求添加到子着色器和通道可以避免在着色器代码使用未安装的包或需要特定版本的包进行编译的包中的包含文件时出现编译错误。
渲染管线兼容性
功能名称 | 内置渲染管线 | 通用渲染管线 (URP) | 高清渲染管线 (HDRP) | 自定义 SRP |
---|---|---|---|---|
着色器实验室:包需求块 | 是 | 是 | 是 | 是 |
使用“包要求”块
要指定子着色器或通道的包要求,请使用块。ShaderLab 支持每个 SubShader 或 Pass 一个块,但每个块可以指定多个包要求。PackageRequirementsPackageRequirements
注意:如果提供块,则该块必须位于子着色器或通道中的所有其他声明之前。PackageRequirements
签名 | 功能 |
---|---|
PackageRequirements{ [requirement definition]} | 定义通道或子着色器的包要求。 |
有多种方法可以声明包要求。每个都提供不同的行为。它们是:
- “<包名称>”:指定子着色器或通道适用于包的任何版本。
- “<包名称>”: “<版本限制>”:指定子着色器或通道仅适用于包版本的子集。
- “<包名称>”: “unity=<版本限制>”:指定子着色器或通道仅适用于 Unity 版本的子集,并且需要具有给定名称的包。
- “unity”:“<版本限制>”:指定子着色器或通道仅适用于 Unity 版本的子集。
版本限制定义一组版本范围。如果所需包的已安装版本不在任何范围内,则不满足包要求。同样,如果要求指定了一组 Unity 版本限制,则同样适用于当前版本的 Unity。有关版本限制的语法的信息,请参阅版本语法。
如果子着色器或通道声明了项目不满足的包要求,Unity 会将子着色器或通道排除在进一步处理和编译之外。如果项目不包含所需的包,或者包含它们但不包含兼容版本,则会发生这种情况。如果着色器不包含满足要求的单个子着色器,或者没有子着色器包含满足要求的通道,则“控制台”窗口将显示一条警告消息。
版本语法
在 ShaderLab 的包要求中,版本使用 or 格式。如果仅使用 ,Unity 将用于 .软件包版本还可以包含 或后缀,其中等效于 。预览版先于非预览版,因此在 之后但之前。major.minormajor.minor.patchmajor.minor0patch-preview-preview.n-preview-preview.01.2.3-preview.41.2.21.2.3
有多种方法可以指定版本范围。每个都提供不同的行为。它们是:
- <版本>:包括您输入的版本以及之后的所有版本。例如,包括以
1.2.31.2.3
; - [<版本>]:指定确切的版本。例如,仅包含版本
[1.2.3]1.2.3
; - [<版本1>,<版本2>]:指定介于<版本 1> 和<版本 2> 之间的范围。使用方括号和圆括号会导致范围分别包含或排除到版本。左方括号影响<版本 1>,右方括号影响<版本 2>。示例:包括从 1.2.3 到 2.3.3 的所有版本。
[1.2.3,2.3.4)
还可以为单个包指定版本范围集。若要从各个范围创建一组版本范围,请使用分号作为分隔符。例如,包括从 2.0.0 到 3.4.5、版本 3.7.0 和版本 4.0.0 及更高版本的版本。[2.0,3.4.5];[3.7];4.0
设置包的版本时,请注意以下事项:
- 版本、版本范围和版本范围集不能包含任何额外的字符。
- 版本范围不能为空。
- 版本范围集不能有交集。
如果语法不符合上述规定,则版本限制无效。有关无效包要求发生的情况的详细信息,请参阅错误检查。
示例
下面的代码示例演示如何在 SubShader 和 Pass 中指定包要求。SubShader 为名为“com.my.package”的包声明单个包要求,并适用于从 2.2.0 开始的任何包版本。子着色器有两个通道:
- 第一张通行证要求:
- 版本介于 10.2.1 和 11.0 之间的通用渲染管线包。
- 版本为 3.2 或更高版本的文本网格专业版包。
- 第二张通行证要求:
- 版本介于 8.0 到 8.5 之间的高清渲染管线包
Shader "Examples/ExampleShader"
{
SubShader
{
PackageRequirements
{
"com.my.package": "2.2"
}
Pass
{
PackageRequirements
{
"com.unity.render-pipelines.universal": "[10.2.1,11.0]"
"com.unity.textmeshpro": "3.2"
}
}
Pass
{
PackageRequirements
{
"com.unity.render-pipelines.high-definition": "[8.0,8.5]"
}
}
}
}
错误检查
如果定义永远无法满足的包要求,着色器导入过程将失败并显示错误。本节提供最常见的无效包要求定义的示例。
格式错误的版本或空包名称
PackageRequirements {
"com.some.package.x": "[10.2.1,9.0]" // Error, empty version range
"com.some.package.y": "[10.2.1.9,11.0]" // Error, incorrect version format
"com.some.package.z": "[2.3,3.5],[3.0,4.0]" // Error, ranges intersect
"" : "[2.3.4,3.4.5]" // Error, no package name provided
}
同一包上的多个依赖项
PackageRequirements {
"com.some.package.x": "[10.2.1,11.0]"
"com.some.package.x": "[11.2.1,12.0]" // Error, dependency on "com.some.package.x" declared twice
"unity" : "2021.2"
"unity" : "2021.3" // Error, dependency on Unity version declared twice
}
冲突的依赖项声明
PackageRequirements {
"com.some.package.x": "unity=[2021.2.1,2021.3.3]"
"unity" : "2021.2" // Error: Unity version requirement cannot be declared on a package and on its own simultaneously
}
子着色器和通道之间的依赖关系声明冲突
SubShader {
PackageRequirements {
"com.some.package.x": "[2.3.4,3.4.5]"
"com.some.package.z": "[1.1,3.2]"
"unity": "2021.2"
}
Pass {
PackageRequirements {
"com.some.package.y": "[1.2.2,2.5]" // Fine, SubShader doesn’t declare a dependency on "com.some.package.y"
"com.some.package.z": "[2.0,3.1]" // Fine, SubShader dependency intersects the provided version range
"com.some.package.x": "[1.1.1, 2.2.2]" // Error, SubShader version range for "com.some.package.x" does not intersect the provided range
"com.some.package.w": "unity=[2021.2.1,2021.2.5]" // Fine, SubShader dependency intersects the provided version range
"com.some.package.u": "unity=[2020.2.1,2020.2.5]" // Error, SubShader Unity version range does not intersect the provided range
}
}
}
由3D建模学习工作室整理翻译,转载请注明出处!