用一张图来说清楚Unity针对Shader的跨平台处理方案。
[plantuml]
title Unity cross-platform shader solution\nhttps://tis.ac.cn/blog/kongdeyou/shader_cross_platform_compile_unity/
partition Source {
  :ShaderLab>
}
partition DirectX(DX11,DX12) {
  :HLSL>
  :D3D Compiler;
  :DX-BC]
}
:HLSLcc;
note right
  decompiler
end note
split
  partition OpenGL {
    :GLSL>
  }
  partition Vulkan {
    :glslang;
    :SPIRV]
  }
  kill
split again
  partition Metal {
    :Metal SL>
    :MSL Compiler;
    :metallib]
  }
  kill
end split
[/plantuml]
和上一篇文章很相似,我们在最开始的文章中提到过,Unity的解决方案是Bytecode to Source的方式。
Unity以HLSL语言作为Shader的源语言,但没有直接将HLSL暴露给用户,Unity的可编程渲染管线我理解是只能“部分定制”,或者说部分可编程的,因为出于易用性的考虑,Unity封装了一层ShaderLab语言,且只将ShaderLab暴露给用户。
Unity首先将ShaderLab转化为HLSL,然后将HLSL的Shader代码编译成DXBC。针对非DirectX平台,我们可以将Unity的HLSLcc理解为一个反编译器,它负责将DXBC反编译出GLSL代码或MSL代码。
协议
本文以上内容遵循CC BY-ND 4.0协议,署名-禁止演绎。
转载请注明出处:https://tis.ac.cn/blog/kongdeyou/shader_cross_platform_compile_unity/
并署名:kongdeyou(https://tis.ac.cn/blog/author/kongdeyou/)
 
                 
            