Shader跨平台编译:Unity

  1. 协议

用一张图来说清楚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/)

原始链接:https://blog.kdyx.net/blog/kongdeyou/shader_cross_platform_compile_unity/

版权声明: "CC BY-NC-ND 4.0" 署名-不可商用-禁止演绎 转载请注明原文链接及作者信息,侵权必究。

×

喜欢或有帮助?赞赏下作者呗!