DirectX Shader CompilerでSPIR-Vを出力する
DirectX Shader Compiler(dxc)動作テスト用のHLSLを用意する。 MonoGameでfxファイルを新規作成すると出来上がるソースコードを流用している。
matrix WorldViewProjection;
struct VertexShaderInput
{
float4 Position : POSITION0;
float4 Color : COLOR0;
};
struct VertexShaderOutput
{
float4 Position : SV_POSITION;
float4 Color : COLOR0;
};
VertexShaderOutput MainVS(in VertexShaderInput input)
{
VertexShaderOutput output = (VertexShaderOutput)0;
output.Position = mul(input.Position, WorldViewProjection);
output.Color = input.Color;
return output;
}
float4 MainPS(VertexShaderOutput input) : COLOR
{
return input.Color;
}
dxcでは従来の「technique」と「pass」の概念がなくなった。
technique BasicColorDrawing
{
pass P0
{
VertexShader = compile vs_3_0 MainVS();
PixelShader = compile ps_3_0 MainPS();
}
};
このpass句の中の1行1行がdxcコマンドになった感じである。 technique句があるとエラーになるのでコメントアウトして、代わりにdxcコマンドを呼び出すシェルスクリプトを書くといい感じのようだ。
./dxc -T vs_6_0 -E MainVS light.fx ./dxc -T ps_6_0 -E MainPS light.fx
SPIR-Vを出力するには「-spirv」オプションを付けるだけだ。
./dxc -spirv -T vs_6_0 -E MainVS light.fx ./dxc -spirv -T ps_6_0 -E MainPS light.fx
dxcを実行するとファイルが生成されるのではなく標準出力にアセンブリ形式がドスンと表示される。男らしさがヤバい。
アセンブリ言語形式ではなくバイナリ形式でファイルに保存するには「-Fo」オプションを指定する。
./dxc -spirv -T vs_6_0 -E MainVS light.fx -Fo light_vs.spv ./dxc -spirv -T ps_6_0 -E MainPS light.fx -Fo light_ps.spv