Origin: http://aras-p.info/blog/2014/03/28/cross-platform-shaders-in-2014/
简译 translation:
作者在2012年写过一篇shader跨平台的文章, 开始提到了并有链接.
1.手写或者宏替换
使用宏定义将 HLSL & GLSL 的不同之处封装, 并让每个开发人员了解他们的不同之处. 例子: Valve的Source 2引擎
优点: 简单,容易实现
缺点: 每个开发者都必须熟悉使用宏定义库, 还有其他语法上的不同.
2.设计自己的Shader Langugage, 并转换为HLSL/GLSL后端代码
或者使用可视化shader编辑器来动态生成HLSL/GLSL.
3.将HLSL的byte code翻译成GLSL
优点: byte code翻译比HLSL翻译更简单. 而且M$的D3DCompile做了很好的优化, 这样从优化后的byte code, 可以直接转为足够优化的GLSL.
缺点:HLSL的封闭式工具链, 只能在windows上跑. HLSL的编译器做的优化可能太过, 有些优化对于现代显卡没有意义.
对应的工具:
4.在源代码级别将HLSL翻译为GLSL, 或者GLSL到HLSL
原作者是hlsl2glslfork的owner, 使用的是hlsl2glslfork+glsloptimizer(感觉是Unity内部的?).他也曾想过UE4的方式, 用自己的解析器, 或者Mesa 的GLSL栈, 替换掉hlsl2glslfork, 因为Mesa的GLSL代码比hlsl2glslfork的好, 而且支持SM3.0以后的特性,但是他没有时间做.
总结:
作者认为, 目前看来, 最终需要使用两种shader了. 独立于硬件(可以在不同硬件上跑的shader)的方案不太可行. 比如nVidia的Cg, 现在基本停止开发了.(可能是因为Cg太早了, 如果换做现在或许会好点).
翻译DX9 HLSL的方式, 这个基本已经有了解决方案, 比如hlsl2glslfork, mojoshader, ANGLE. 但是目前缺乏DX10/DX11级别的翻译/转换工具, 只有byte code级别的.