IPreprocessComputeShaders.OnProcessComputeShader
Declaration
public void OnProcessComputeShader(ComputeShader shader, string kernelName, IList<ShaderCompilerData> data);Параметры
| Параметр | Описание |
|---|---|
| шейдер | Вычислительный шейдер, который Unity собирается компилировать. |
| kernelName | Имя ядра, которое Unity собирается компилировать. |
| данные | Список вариантов шейдеров, которые Unity собирается компилировать. |
Описание
Реализуйте этот интерфейс, чтобы получать обратный вызов перед тем, как Unity скомпилирует ядро вычислительного шейдера в сборку.
Используйте этот callback, чтобы проверить варианты вычислительных шейдеров, которые Unity собирается скомпилировать в сборку, и исключить ненужные варианты. Исключение ненужных вариантов шейдеров может уменьшить размер сборки и время её создания.
Варианты представлены структурами ShaderCompilerData. Для каждого варианта можно с помощью ShaderKeywordSet.IsEnabled проверить, включены ли указанные глобальные или локальные ключевые слова.
Чтобы проверить, включено ли в варианте глобальное ключевое слово, создайте экземпляр ShaderKeyword с именем этого глобального ключевого слова. Чтобы проверить, включено ли локальное ключевое слово, создайте экземпляр ShaderKeyword с именем локального ключевого слова и дополнительным параметром, указывающим вычислительный шейдер, который использует это слово.
Чтобы исключить вариант шейдера из сборки, непосредственно удалите элементы из data. Обратите внимание: поочерёдное удаление элементов в цикле for может выполняться медленно. Если требуется удалить много элементов, переместите ненужные элементы в конец списка, а затем удалите их одной операцией.
Обратите внимание, что этот callback предоставляет сведения только о вычислительных шейдерах. Сведения об обычных шейдерах, которые Unity собирается скомпилировать в сборку, см. в описании IPreprocessShaders.
Этот callback вызывается как для сборок Player, так и для сборок 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); } } }