返回「计算机、信息技术与工程」

OnProcessShader回调方法,为什么同一个shader会多次回调此方法?

更多
Markdown 结构化数据
本文目录 3 个章节

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
  • 采纳状态:未采纳

来源与关系