這是知乎上的一個問題: 新版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現在的流程圖