Unity雜談-SRP爲何再也不使用CG

這是知乎上的一個問題: 新版Unity shader庫爲何用HLSL,而不用CG了?工具

正好和我以前看到幾篇文章相關, 因此整理一下作一個筆記.spa

跨平臺shader編譯的過去、如今和將來 - 知乎
做者是叛逆者, 在KlayGE的開發過程當中, 自己有跨平臺編譯着色器的需求.
本文介紹了做者遇到的問題以及解決方案.
這是一篇2017年的文章, 一直到加入了SPIR-V, 支持Vulkan爲止.

Shader交叉編譯之夢 - 知乎
做者仍是叛逆者, 介紹了他的開源項目:Microsoft/ShaderConductor, 用於鏈接DirectXShaderCompiler和SPIRV-Cross.
和上文相比, 流程圖中多了Metal的MSL.
寫做時間在2018年

跨平臺引擎Shader編譯流程分析 - 知乎
做者是周泰, 本文介紹了UE和Unity的編譯流程, 其中Unity部分分紅兩代.
若是看過了前面兩篇文章, 那麼對這篇文章的理解不會太困難.
寫做時間在2019年blog

首先看Unity前期爲何使用Cg, 由於Cg能打通HLSL和GLSL.開發

首先HLSL和Cg語言類似, 差別部分能夠用宏來處理, 而Cg到HLSL能夠由其餘工具進行轉換.get

Cg自己的編譯器就能夠提供Cg到GLSL的轉換, 可是叛逆者在文中也說了, 生成的GLSL遵照的是NVIDIA的規矩, 對AMD, Intel的支持就有問題.編譯器

固然對於Unreal Engine或者Unity來講, 固然有能力本身維護一份轉換的代碼.it

比較下面兩張圖, 第一張是Unity初期的流程, 第二張圖是KlayGE的第二版流程

io

 

 

再日後各類着色器語音不斷髮展, 而Cg則在2012年以後再無更新.
在功能上, 看看上圖中被打叉的Hull Shader, Domain Shader和Compute Shader.
在跨平臺方面呢, 向Vulkan, Metal的線也難以鏈接.編譯

這個時候SPIR-V成爲了鏈接全部着色語言新的橋樑.im

微軟推出了DirectXShaderCompiler, 能夠把HLSL編譯爲SPIR-V, 可直接用於Vulkan和較新的OpenGL.

Khronos Group則推出了SPIRV-Cross, 能夠把SPIR-V轉換爲OpenGL的GLSL, OpenGL ES的ESSL, Metal的MSL.

這樣就把全部的着色語言鏈接了起來, 至於Cg, 很遺憾, 已經沒有它的位置了.

下面這張圖是Unity如今的流程圖

相關文章
相關標籤/搜索