---
title: "OnProcessShader回调方法，为什么同一个shader会多次回调此方法？"
author: "石心.Yong"
published_by: "Perrin Yong"
canonical: https://www.pystone.net/notes/uwa-answer-on-process-shader-repeated-callbacks/
type: note
content_role: source
source_type: "source"
visibility: public
id_stability: rename-stable
source_path: "10-计算机、信息技术与工程/05-游戏图形与运行时/我的UWA问答/2021-08-11 - OnProcessShader回调方法，为什么同一个shader会多次回调此方法？.md"
content_hash: 737d0be6a266334a436d2b728cf2aa9010435db51b71097aa084b4950f231ae9
knowledge_version: 224c990773de.5fa8af6e39fa
site_commit: 224c990773de166d23a886306577dd90379529ce
notes_commit: 5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a
---
# OnProcessShader回调方法，为什么同一个shader会多次回调此方法？

> **note · 我的 UWA 问答**
> 本文收录我在 UWA 问答发表的公开回答。问题内容归原提问者；回答保留当时语境，技术结论可能受 Unity 版本、平台和项目条件限制。

## 问题

unity2018.4.36f1 在打安卓包时，发现OnProcessShader回调方法，同一个shader会被回调多次。

- 提问者：龙少
- 提问时间：2021-08-11 18:51:17

## 我的回答

简单地理解，OnProcessShader并不是一个“Shader资源“调用一次，而是一个 ”shader snippet“ 调用一次。官网上的说法：Implement this interface to receive a callback before a shader snippet is compiled.

从这个函数的参数也可以看得出来，函数的一次调用，对应的是一个 Shader 的 一个 ShaderSnippetData。

```
OnProcessShader( Shader shader, ShaderSnippetData snippet, IList<ShaderCompilerData> data )
```

###

至于要理解清楚的话，这个问题本质就是概念的定义与理解问题了。

而对于 ”snippet“ 的定义，Unity官网的定义其实也有点矛盾，官方文档的说法与OnProcessShader函数用的概念是不一致的。

比如官方文档表示：An HLSL snippet must contain at least a vertex program and a fragment program. 也就是说：一个snippet至少包含一个 vertex program和一个fragment program。

(https://docs.unity3d.com/Manual/SL-PragmaDirectives.html)

而OnProcessShader函数的介绍文档中表示：Shader snippet: The HLSL input code with dependencies for a single shader stage.  也就是说：一个snippet 对应的就是一个stage（vertex, fragment等等）

(https://blog.unity.com/technology/stripping-scriptable-shader-variants)

- 回答时间：2021-08-11 20:52:36
- 最后更新：2021-08-11 20:53:17
- 采纳状态：未采纳

## 来源与关系

- 上位集合：[我的 UWA 问答](https://www.pystone.net/notes/my-uwa-answers/)
- UWA 标签：Shader
- 原始问题：[OnProcessShader回调方法，为什么同一个shader会多次回调此方法？](https://answer.uwa4d.com/question/61133b258f8c83424167271d)
- 源页最后更新：2021-08-17 19:30:29
