1.ShaderLaber的构成:
由四个部分组成:
shader Text; ShaderCompiler; ShaderLabAsset; Shader Runtime
上面的四个部分组成了ShaderLab, 我们说的 ShaderLab 大 是 上面的四个部分大。
2.ShaderLab Asset::
shader Bundle 或者是 AlwaysIncludeShaders 这两个常见的地方
其中 AlwaysIncludeShaders 下的shader: 我们打出来的包 Resources下面的 Level 或者 SharedAssets 的文件内
shader预处理: 使用ShaderVariantCollection .WarmUp , 预编译加载后的所有Shader:
(1).此时就已经生成 ShaderVariant 使用 ShaderCompiler的步骤, 产生 shader compilation info,写入到ShaderCatch文件夹中
(2)将 Shader Compilation info 中的信息编译出来后, 会把相关的信息序列化写回到 shaderCatch中
此时ShaderCatch 中存储的是中间态的东西 类似于 IL
最终编译成可运行的版本:
(1)如果ShaderCatch中有 则从shaderCatch中取 如果没有 则走 process流程重新产生 shaderCompilation Info
特别提醒: 此处就是 ShaderVariant Collection。WarmUp 的作用, 只在 第一次运行游戏的生成并存储在ShaderCatch中
(2)我们要把 中间态 的 东西 最终编译成什么????
在运行时 用SLSL CC编译为目标平台去!!!! CC: 交叉编译器的意思
3.下文是Real-Time Rendering 中的一句话 而触发的自己对整篇文章总结感悟
HLSL 可以被编译为虚拟机字节码(IL或者DXIL), 就表示允许着色器程序被编译和离线存储。
shader.WarmupAllShaders 是不可控的, 会把shader的所有的变体 都warmup一遍,
而shaderVariantCollection.WarmUp 预热的只有你会使用到的shader的变体
shaderVariantCollection: 所以在 首包安装 加载所有的shader, 执行 ShaderVariantCollection.WarmUp, 这样所有的shader就编译和catch了
再次运行游戏,如果已经 shader 已经预热过了,再执行 shaderVariantCollection.WarmUp 就什么也不做,没有消耗(详见 官方文档),
4.推荐使用ShaderVariantCollection.WarmUp 而不是使用 Shader.WarmupAllShaders.
因为 Shader.WarmupAllShaders 会把已经加载出的shader的所有的变体都编译出来。