# OnProcessComputeShader(ComputeShader, string, IList<ShaderCompilerData>)

> Implement this interface to receive a callback before Unity compiles a compute shader kernel into a build.

## Definition

* **Type:** Method
* **Namespace:** [UnityEditor.Build](/engine/6000.6/script-reference/unityeditor/build.md)
* **Assembly:** UnityEditor.CoreModule

```csharp
void OnProcessComputeShader(ComputeShader shader, string kernelName, IList<ShaderCompilerData> data)
```

### Parameters

**** (\[ComputeShader]\(/engine/6000.6/script-reference/unityengine/computeshader)): The compute shader that Unity is about to compile.**** (\[string]\(https\://learn.microsoft.com/dotnet/api/system.string)): The name of the kernel that Unity is about to compile.**** (\[IList\<ShaderCompilerData>]\(https\://learn.microsoft.com/dotnet/api/system.collections.generic.ilist-1)): The list of shader variants that Unity is about to compile.

### Remarks

Use this callback to examine the compute shader variants that Unity is about to compile into your build, and exclude any variant that you do not want. Excluding unwanted shader variants can reduce build size and build times.

Variants are represented by [ShaderCompilerData](/engine/6000.6/script-reference/unityeditor/rendering/shadercompilerdata.md) structs. For each variant, you can check whether given global or local keywords are enabled using IsEnabled.

To check whether a variant has a global keyword enabled, create a [ShaderKeyword](/engine/6000.6/script-reference/unityengine/rendering/shaderkeyword.md) instance with the name of the global keyword. To check whether a variant has a local keyword enabled, create a [ShaderKeyword](/engine/6000.6/script-reference/unityengine/rendering/shaderkeyword.md) instance with the name of the local keyword and an additional parameter that specifies the compute shader that uses the local keyword.

To exclude a shader variant from the build, directly remove the elements from `data` . Note that removing elements individually in a for loop can be slow; if you are removing a lot of elements, consider moving the unwanted elements to the end of the List and then removing them all in a single operation.

Note that this callback only provides details of compute shaders. To see regular shaders that Unity is about to compile into the build, see [IPreprocessShaders](/engine/6000.6/script-reference/unityeditor/build/ipreprocessshaders.md) .

This callback is invoked for Player, AssetBundle, and content directory builds.

For more information about build callbacks, refer to [Use build callbacks](/engine/6000.6/manual/building-and-publishing/build-customize-build-pipeline/build-callbacks.md)

Additional Resources: Shader variants and keywords, [Declaring and using shader keywords in HLSL](/engine/6000.6/manual/materials-and-shaders/shaders/writing-custom/shader-writing/sl-multiple-program-variants.md), [BuildPipeline.BuildPlayer](/engine/6000.6/script-reference/unityeditor/buildpipeline/buildplayer.md), [BuildPipeline.BuildAssetBundles](/engine/6000.6/script-reference/unityeditor/buildpipeline/buildassetbundles.md), [BuildPipeline.BuildContentDirectory](/engine/6000.6/script-reference/unityeditor/buildpipeline/buildcontentdirectory.md)

### Examples

```csharp
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);
        }
    }
}
```
