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

よりつっこんだ使い方などの解説はそのうちするかもしれません.