Unity TechnologiesがHLSLのバイトコードをGLSLやMetal Shading Languageに変換するHLSLccをオープンソース化しました.
HLSLcc
https://github.com/Unity-Technologies/HLSLcc
Unityは古くは,ATIのHLSL2GLSLをフォークしたhlsl2glslforkを使っていたことがありましたが,DX9スタイルのシェーダしかコンバートができなかったのでいつからか別な環境に代わったのですがソースを公開しない形になっていました.今回新たにUnityのシェーダの変換の仕組みがオープンソース化されたようですね.
HLSLccはUnity内部で様々なグラフィックスAPI向けのシェーダの生成に使われているようです.HLSLccはHLSLのバイトコードからシェーダを生成するのですが,fxcのコンパイルオプション”-Fo”で出力できると思います.
FXC.exeの構文
https://msdn.microsoft.com/ja-jp/library/bb509709(v=vs.85).aspx
HLSLccはHLSLCrossCompilerをベースに機能の拡張やコードのメンテナンスを行ったようです.
HLSLCrossCompiler
https://github.com/James-Jones/HLSLCrossCompiler
機能の追加によって,GLSL(Vulkanへの対応はHLSLCrossCompilerでは対応していません)の対応だけでなくMetal Shading Languageなどの出力などに対応しています.
- GLSL (OpenGL 3.2 and later)
- GLSL ES (OpenGL ES 3.0 and later)
- GLSL for Vulkan consumption (as input for Glslang to generate SPIR-V)
- Metal Shading Language
CMakeをかけてビルドを行ってみましたが,VS 2015だとDLLとしてビルドされるよう設定されていました(ちなみに,私の環境ではビルドエラーがでまくりましたがすぐに直せる範囲でした).開始はHLSL.cppのTranslateHLSLFromFile関数(ファイルから読み込み)やTranslateHLSLFromMem関数(メモリ内のシェーダのバイトコードから生成)を呼び出せばよいようです.
https://github.com/Unity-Technologies/HLSLcc/blob/master/src/HLSLcc.cpp
DLLできた後は,hlslcc.hに定義があります.
https://github.com/Unity-Technologies/HLSLcc/blob/master/include/hlslcc.h
よりつっこんだ使い方などの解説はそのうちするかもしれません.