版本: Unity 6 (6000.0)
语言English
  • C#

IPreprocessComputeShaders.OnProcessComputeShader

建议修改

成功!

感谢您帮助我们提高 Unity 文档的质量。虽然我们无法接受所有提交,但我们确实会阅读用户提出的每一项修改建议,并在适用的情况下进行更新。

关闭

提交失败

由于某些原因,您的修改建议无法提交。请<a>稍后再试</a>。感谢您抽出时间帮助我们提高 Unity 文档的质量。

关闭

取消

声明

public void OnProcessComputeShader(ComputeShader shader, string kernelName, IList<ShaderCompilerData> data);

参数

shader Unity 即将编译的计算着色器。
kernelName Unity 即将编译的核心名称。
data Unity 即将编译的着色器变体列表。

描述

实现此接口可在 Unity 将计算着色器核心编译到构建之前接收回调。

使用此回调检查 Unity 即将编译到构建中的计算着色器变体,并排除任何不需要的变体。排除不需要的着色器变体可以减少构建大小和构建时间。

变体由 ShaderCompilerData 结构表示。对于每个变体,您可以使用 ShaderKeywordSet.IsEnabled 检查是否启用了给定的全局或局部关键字。

要检查是否启用了变体的全局关键字,请使用全局关键字的名称创建一个 ShaderKeyword 实例。要检查是否启用了变体的局部关键字,请使用局部关键字的名称创建一个 ShaderKeyword 实例,并添加一个指定使用局部关键字的计算着色器的参数。

要从构建中排除着色器变体,请直接从 data 中删除元素。请注意,在 for 循环中逐个删除元素可能会很慢;如果您要删除大量元素,请考虑将不需要的元素移动到 List 的末尾,然后在单个操作中删除它们。

请注意,此回调仅提供计算着色器的详细信息。要查看 Unity 即将编译到构建中的常规着色器,请参阅 IPreprocessShaders

此回调在播放器和 AssetBundle 构建中均会被调用。

其他资源:着色器变体和关键字在 HLSL 中声明和使用着色器关键字BuildPipeline.BuildPlayerBuildPipeline.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); } } }