这是知乎上的一个问题: 新版Unity shader库为什么用HLSL,而不用CG了?
正好和我之前看到几篇文章相关, 所以整理一下做一个笔记.
• 跨平台shader编译的过去、现在和未来 - 知乎
作者是叛逆者, 在KlayGE的开发过程中, 本身有跨平台编译着色器的需求.
本文介绍了作者遇到的问题以及解决方案.
这是一篇2017年的文章, 一直到加入了SPIR-V, 支持Vulkan为止.
• Shader交叉编译之梦 - 知乎
作者还是叛逆者, 介绍了他的开源项目:Microsoft/ShaderConductor, 用于连接DirectXShaderCompiler和SPIRV-Cross.
和上文相比, 流程图中多了Metal的MSL.
写作时间在2018年
• 跨平台引擎Shader编译流程分析 - 知乎
作者是周泰, 本文介绍了UE和Unity的编译流程, 其中Unity部分分成两代.
如果看过了前面两篇文章, 那么对这篇文章的理解不会太困难.
写作时间在2019年
首先看Unity前期为什么使用Cg, 因为Cg能打通HLSL和GLSL.
首先HLSL和Cg语言相似, 差异部分可以用宏来处理, 而Cg到HLSL可以由其他工具进行转换.
Cg本身的编译器就可以提供Cg到GLSL的转换, 但是叛逆者在文中也说了, 生成的GLSL遵守的是NVIDIA的规矩, 对AMD, Intel的支持就有问题.
当然对于Unreal Engine或者Unity来说, 当然有能力自己维护一份转换的代码.
比较下面两张图, 第一张是Unity初期的流程, 第二张图是KlayGE的第二版流程
再往后各种着色器语音不断发展, 而Cg则在2012年之后再无更新.
在功能上, 看看上图中被打叉的Hull Shader, Domain Shader和Compute Shader.
在跨平台方面呢, 向Vulkan, Metal的线也难以连接.
这个时候SPIR-V成为了连接所有着色语言新的桥梁.
微软推出了DirectXShaderCompiler, 可以把HLSL编译为SPIR-V, 可直接用于Vulkan和较新的OpenGL.
Khronos Group则推出了SPIRV-Cross, 可以把SPIR-V转换为OpenGL的GLSL, OpenGL ES的ESSL, Metal的MSL.
这样就把所有的着色语言连接了起来, 至于Cg, 很遗憾, 已经没有它的位置了.
下面这张图是Unity现在的流程图