{
  "schemaVersion": "0.11.0",
  "canonical": "https://www.pystone.net/notes/uwa-answer-on-process-shader-repeated-callbacks/",
  "atlas": "https://www.pystone.net/?node=uwa-answer-on-process-shader-repeated-callbacks#knowledge-atlas",
  "markdown": "https://www.pystone.net/notes/uwa-answer-on-process-shader-repeated-callbacks.md",
  "context": "https://www.pystone.net/notes/uwa-answer-on-process-shader-repeated-callbacks.context.json",
  "knowledgeVersion": "224c990773de.5fa8af6e39fa",
  "build": {
    "siteCommit": "224c990773de166d23a886306577dd90379529ce",
    "notesCommit": "5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a",
    "builtAt": "1970-01-01T00:00:00.000Z",
    "version": "224c990773de.5fa8af6e39fa"
  },
  "id": "note:uwa-answer-on-process-shader-repeated-callbacks",
  "slug": "uwa-answer-on-process-shader-repeated-callbacks",
  "title": "OnProcessShader回调方法，为什么同一个shader会多次回调此方法？",
  "type": "note",
  "visibility": "public",
  "idStability": "rename-stable",
  "author": {
    "name": "石心.Yong"
  },
  "publisher": {
    "name": "Perrin Yong",
    "profile": "https://www.pystone.net/profile/"
  },
  "aliases": [],
  "summary": "OnProcessShader回调方法，为什么同一个shader会多次回调此方法？",
  "contentRole": "source",
  "sourceType": "source",
  "sourceMetadata": {
    "author": "石心.Yong"
  },
  "isMoc": false,
  "mocRecognition": "none",
  "generated": false,
  "attribution": "external_source",
  "domain": "10-计算机、信息技术与工程",
  "tags": [],
  "mocs": [],
  "contentHash": "737d0be6a266334a436d2b728cf2aa9010435db51b71097aa084b4950f231ae9",
  "assets": [],
  "headings": [
    {
      "depth": 1,
      "text": "OnProcessShader回调方法，为什么同一个shader会多次回调此方法？",
      "anchor": "onprocessshader回调方法为什么同一个shader会多次回调此方法",
      "citation": "https://www.pystone.net/notes/uwa-answer-on-process-shader-repeated-callbacks/#onprocessshader%E5%9B%9E%E8%B0%83%E6%96%B9%E6%B3%95%E4%B8%BA%E4%BB%80%E4%B9%88%E5%90%8C%E4%B8%80%E4%B8%AAshader%E4%BC%9A%E5%A4%9A%E6%AC%A1%E5%9B%9E%E8%B0%83%E6%AD%A4%E6%96%B9%E6%B3%95"
    },
    {
      "depth": 2,
      "text": "问题",
      "anchor": "问题",
      "citation": "https://www.pystone.net/notes/uwa-answer-on-process-shader-repeated-callbacks/#%E9%97%AE%E9%A2%98"
    },
    {
      "depth": 2,
      "text": "我的回答",
      "anchor": "我的回答",
      "citation": "https://www.pystone.net/notes/uwa-answer-on-process-shader-repeated-callbacks/#%E6%88%91%E7%9A%84%E5%9B%9E%E7%AD%94"
    },
    {
      "depth": 2,
      "text": "来源与关系",
      "anchor": "来源与关系",
      "citation": "https://www.pystone.net/notes/uwa-answer-on-process-shader-repeated-callbacks/#%E6%9D%A5%E6%BA%90%E4%B8%8E%E5%85%B3%E7%B3%BB"
    }
  ],
  "claims": [],
  "outgoing": [
    {
      "id": "note:my-uwa-answers",
      "title": "我的 UWA 问答",
      "url": "https://www.pystone.net/notes/my-uwa-answers/",
      "atlas": "https://www.pystone.net/?node=my-uwa-answers#knowledge-atlas",
      "label": "我的 UWA 问答",
      "origin": "explicit",
      "humanReviewed": true,
      "context": "上位集合：我的 UWA 问答",
      "citation": "https://www.pystone.net/notes/uwa-answer-on-process-shader-repeated-callbacks/#%E6%9D%A5%E6%BA%90%E4%B8%8E%E5%85%B3%E7%B3%BB"
    }
  ],
  "incoming": [
    {
      "id": "note:my-uwa-answers",
      "title": "我的 UWA 问答",
      "url": "https://www.pystone.net/notes/my-uwa-answers/",
      "atlas": "https://www.pystone.net/?node=my-uwa-answers#knowledge-atlas",
      "label": "我的 UWA 问答",
      "origin": "explicit",
      "humanReviewed": true,
      "context": "2021-08-11：OnProcessShader回调方法，为什么同一个shader会多次回调此方法？（Shader）",
      "citation": "https://www.pystone.net/notes/my-uwa-answers/#2021"
    },
    {
      "id": "note:game-graphics-and-runtime",
      "title": "游戏图形与运行时",
      "url": "https://www.pystone.net/notes/game-graphics-and-runtime/",
      "atlas": "https://www.pystone.net/?node=game-graphics-and-runtime#knowledge-atlas",
      "label": "游戏图形与运行时",
      "origin": "explicit",
      "humanReviewed": true,
      "context": "我的UWA问答中的“2021-08-11 - OnProcessShader回调方法，为什么同一个shader会多次回调此方法？”导航项",
      "citation": "https://www.pystone.net/notes/game-graphics-and-runtime/#%E6%88%91%E7%9A%84uwa%E9%97%AE%E7%AD%94"
    }
  ],
  "contentMarkdown": "# OnProcessShader回调方法，为什么同一个shader会多次回调此方法？\n\n> [!note] 我的 UWA 问答\n> 本文收录我在 UWA 问答发表的公开回答。问题内容归原提问者；回答保留当时语境，技术结论可能受 Unity 版本、平台和项目条件限制。\n\n## 问题\n\nunity2018.4.36f1 在打安卓包时，发现OnProcessShader回调方法，同一个shader会被回调多次。\n\n- 提问者：龙少\n- 提问时间：2021-08-11 18:51:17\n\n## 我的回答\n\n简单地理解，OnProcessShader并不是一个“Shader资源“调用一次，而是一个 ”shader snippet“ 调用一次。官网上的说法：Implement this interface to receive a callback before a shader snippet is compiled.\n\n从这个函数的参数也可以看得出来，函数的一次调用，对应的是一个 Shader 的 一个 ShaderSnippetData。\n\n```\nOnProcessShader( Shader shader, ShaderSnippetData snippet, IList<ShaderCompilerData> data )\n```\n\n###\n\n至于要理解清楚的话，这个问题本质就是概念的定义与理解问题了。\n\n而对于 ”snippet“ 的定义，Unity官网的定义其实也有点矛盾，官方文档的说法与OnProcessShader函数用的概念是不一致的。\n\n比如官方文档表示：An HLSL snippet must contain at least a vertex program and a fragment program. 也就是说：一个snippet至少包含一个 vertex program和一个fragment program。\n\n(https://docs.unity3d.com/Manual/SL-PragmaDirectives.html)\n\n而OnProcessShader函数的介绍文档中表示：Shader snippet: The HLSL input code with dependencies for a single shader stage.  也就是说：一个snippet 对应的就是一个stage（vertex, fragment等等）\n\n(https://blog.unity.com/technology/stripping-scriptable-shader-variants)\n\n- 回答时间：2021-08-11 20:52:36\n- 最后更新：2021-08-11 20:53:17\n- 采纳状态：未采纳\n\n## 来源与关系\n\n- 上位集合：[[10-计算机、信息技术与工程/05-游戏图形与运行时/我的UWA问答/我的UWA问答|我的 UWA 问答]]\n- UWA 标签：Shader\n- 原始问题：[OnProcessShader回调方法，为什么同一个shader会多次回调此方法？](https://answer.uwa4d.com/question/61133b258f8c83424167271d)\n- 源页最后更新：2021-08-17 19:30:29\n"
}
