ShaderLab

作者: 不正经的搬砖工 | 来源:发表于2021-10-12 16:03 被阅读0次

    1、ShaderLab构成

    (1)ShaderLab Text:Shader编码

    (2)Shader Compiler

    包含Preprocess和Binary Compile过程

    (3)ShaderLab Asset

    编译后生成的文件

    (4)ShaderLab Runtime

    负责运行时Shader解析工作

    2、ShaderLab工作流

    (1)如图2-1,Editor下Shader Compiler会对ShaderLab代码进行预处理生成Shader Compilation Info(中间信息集,包含变体等信息),然后Shader Compilation Info经过序列化写入Libarary/ShaderCache文件下。

    PreProcess过程包含语法解析、词法解析、提取不同语言的片段并使用对应语言的编译器解析。

    图2-1 Editor下ShaderLab工作流

    (2)Editor下运行或打包时,Shader Compiler通过Binary Compile根据第一步生成的信息生成Shader Asset。

    其中Binary Compile为了平台兼容性和实现简便性会进行两步编译,首先使用d3dcompiler将源Shader语言编译成DXBC,然后使用改进的HLSLCC将DXBC编译成目标平台对应的Shader。Unity2020版本后为了提高扩展性,将DXBC替换成DXIL

    图2-3是知乎上一大神总结的Unity中Shader编译流程。

    图2-2 Editor下运行或打包时Shader编译流程 图2-3 Unity中Shader编译流程(转载自https://zhuanlan.zhihu.com/p/56510874)

    (3)真机Runtime加载Shader

    如图2-4,当需要某个shader时,Unity的Persitent Manager会先创建一个Shader Class Instance的壳,然后调用Transfer Function将Shader Asset中存储的shader数据反序列化填充Shader Class Instance,全部数据加载好后再从主线程唤醒进行数据处理。

    图2-4 真机运行时加载Shader流程

    (4)WarmUp

    图2-5 WarmUp机制 图2-6

    如图2-5,当我们WarmUp一个Shader变体时,会对所有的Shader Variant进行打分,最后返回一个分数最高的变体。

    如图2-6,Unity中Warmup一个变体时,CPU内存中存储的Code Data会被加载到GPU中处理,CPU中占用的内存会被Unity清除。

    相关文章

      网友评论

          本文标题:ShaderLab

          本文链接:https://www.haomeiwen.com/subject/ldgqoltx.html