shader | Unity 即将编译的计算着色器。 |
kernelName | Unity 即将编译的核心名称。 |
data | Unity 即将编译的着色器变体列表。 |
实现此接口可在 Unity 将计算着色器核心编译到构建之前接收回调。
使用此回调检查 Unity 即将编译到构建中的计算着色器变体,并排除任何不需要的变体。排除不需要的着色器变体可以减少构建大小和构建时间。
变体由 ShaderCompilerData 结构表示。对于每个变体,您可以使用 ShaderKeywordSet.IsEnabled 检查是否启用了给定的全局或局部关键字。
要检查是否启用了变体的全局关键字,请使用全局关键字的名称创建一个 ShaderKeyword 实例。要检查是否启用了变体的局部关键字,请使用局部关键字的名称创建一个 ShaderKeyword 实例,并添加一个指定使用局部关键字的计算着色器的参数。
要从构建中排除着色器变体,请直接从 data
中删除元素。请注意,在 for 循环中逐个删除元素可能会很慢;如果您要删除大量元素,请考虑将不需要的元素移动到 List 的末尾,然后在单个操作中删除它们。
请注意,此回调仅提供计算着色器的详细信息。要查看 Unity 即将编译到构建中的常规着色器,请参阅 IPreprocessShaders 。
此回调在播放器和 AssetBundle 构建中均会被调用。
其他资源:着色器变体和关键字、在 HLSL 中声明和使用着色器关键字、BuildPipeline.BuildPlayer、BuildPipeline.BuildAssetBundles。
using System.Collections.Generic; using UnityEditor.Build; using UnityEditor.Rendering; using UnityEngine; using UnityEngine.Rendering;
class MyCustomBuildProcessor : IPreprocessComputeShaders { ShaderKeyword m_GlobalKeywordBlue;
public MyCustomBuildProcessor() { // Global keywords are shader agnostic so they can be initialized early m_GlobalKeywordBlue = new ShaderKeyword("_BLUE"); }
public int callbackOrder { get { return 0; } }
public void OnProcessComputeShader(ComputeShader shader, string kernelName, IList<ShaderCompilerData> data) { // Local keywords are initialized here as their constructor needs to specify the shader ShaderKeyword localKeywordRed = new ShaderKeyword(shader, "_RED"); for (int i = data.Count - 1; i >= 0; --i) { // Variants with global keyword _BLUE disabled are included in the build if (!data[i].shaderKeywordSet.IsEnabled(m_GlobalKeywordBlue)) continue;
// Variants with local keyword _RED disabled are included in the build if (!data[i].shaderKeywordSet.IsEnabled(localKeywordRed)) continue;
// Any variants that do not meet the criteria above are stripped from the build. // In this example, Unity strips variants that have both _BLUE and _RED keywords enabled. data.RemoveAt(i); } } }