この記事にかかれていることは2017年12月24日に調べました。
結論
DirectXShaderCompilerを使いましょう。SPIR-Vエミッタが実用一歩手前くらいのレベルになっています。
Googleのfork版を追いかけると楽しいです。
導入
VulkanのシェーダーバイナリはSPIR-V形式です。これはGLSLでシェーダーを記述し、それをSDK同梱のglslang/glslangValidatorを用いることで出力することができます。
でもみなさん、HLSLでシェーダー書きたいですよね。
hlsl2glsl, HLSLParser, HLSLcc (Unity版) のような、何らかの形でHLSLをGLSLへ変換する手法には多くの実績があります。しかしながら、生成されたコードにかかる最適化が十分でないケースがあるという問題も残されています。
さらに、これらのソリューションは時代の最先端であるShader Model 6とDXILに対応していません。
その最先端の仕様、つまりShader Model 6のオフィシャルなコンパイラがDirectXShaderCompilerです。
DirectXShaderCompilerの実装
LLVM/clangの上に実装されており、このことがShader Model 6以降のHLSLの将来性を約束してくれています。そして、従来のHLSLパーサーを書いていたプログラマを泣かせているものでもあります。
SPIR-Vエミッタ
Googleのエンジニアが中心となってSPIR-Vエミッタを実装しています。リポジトリはこちらです。
成果は本家DirectXShaderCompilerにも随時反映されています。
少し前まではcbufferすら使えない(コンパイルが通らない)状態だったのですが、最近では(私が試した範囲の話ですが)まともに動くようになってきています。
おわりに
かなり端折りました。
気が向いたら具体的な変換結果を交えたサンプルプログラムを上げます。