Shader跨平台编译

  1. Shader跨平台编译
    1. 人肉维护
    2. 预编译宏
    3. Source to Source
    4. Bytecode to Source
    5. 传送门
    6. 协议

Shader跨平台编译

对于提供统一平台的图形渲染引擎来说,需要支持多个渲染后端,因此需要考量Shader的跨平台方案。

人肉维护

针对每一个平台单独写一份Shader。当我们的Shader代码量不大,且仅支持少量的渲染后端,才考虑采用这种方式。

预编译宏

通过宏的形式实现针对不同平台的Shader代码,对不同平台实现相同功能的内置函数及变量等用宏定义一个通用的名称。采用这种方式要求不同平台所支持的Shader语言要比较相似。Unreal在处理DirectX的HLSL和PS4的PSSL时就采用的这种方式。如果Shader语法相差较大,就很难用宏来抽象出来,比如Metal的MSL。

Source to Source

选择一种Shader语言作为源语言,当需要跨平台时,将源语言转化为目标平台所支持的语言,再使用目标平台的Shader编译器进行编译。Unreal的Shader跨平台实现方案采用了Source to Source的方式,自己实现了HLSLCC,以HLSL语言的Shader作为输入,转换为GLSL和MSL。

Bytecode to Source

选择一种Shader语言作为源语言,编译出字节码,当需要跨平台时,将源语言的字节码识别并转化为目标平台的源码(事实上字节码转化比直接的源码转化更简单些)。Unity的Shader跨平台实现方案就采用了这种方式,Unity实现了HLSLcc(与Unreal的HLSLCC不同),以HLSL语言的Shader作为输入,编译成DXBC(DirectX Bytecode),再转换为GLSL或MSL。

传送门

Unreal跨平台shader实现方案解析: https://tis.ac.cn/blog/kongdeyou/shader_cross_platform_compile_unreal/
Unity跨平台shader实现方案解析: https://tis.ac.cn/blog/kongdeyou/shader_cross_platform_compile_unity/
Microsoft Shader Conductor跨平台shader实现方案解析: https://tis.ac.cn/blog/kongdeyou/shader_cross_platform_compile_mssc/

协议

本文以上内容遵循CC BY-ND 4.0协议,署名-禁止演绎。 转载请注明出处:https://tis.ac.cn/blog/kongdeyou/shader_cross_platform_compile/
并署名:kongdeyou(https://tis.ac.cn/blog/author/kongdeyou/)

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

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

×

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