こんにちわ,Pocolです。
久しぶりにa3dの更新作業をやっています。
今日は,ついにGLSLから脱却する対応を入れました。
…といっても大したことはしていなくて,DXCからSpir-Vを生成するようにしただけです。
ただ,普通のHLSLの記述だと対応できないそうなので,マクロをかまして対応するという感じにしました。
マクロの定義は下記の通り。
#ifdef __spirv__ #define A3D_LOCATION(index) [[vk::location(index)]] #define A3D_RESOURCE(var, reg, index) [[vk::binding(index)]] var #define A3D_FLIP_Y(var) var.y = -var.y #else #define A3D_LOCATION(index) #define A3D_RESOURCE(var, reg, index) var : register(reg) #define A3D_FLIP_Y(var) #endif
Vulkanの座標系はDirectXと比べて上下逆になる座標系なので,フリップ用のマクロも定義してあります。
実際のシェーダは下記のように書きます。
/////////////////////////////////////////////////////////////////////////////////////////////////// // VSOutput structure /////////////////////////////////////////////////////////////////////////////////////////////////// struct VSOutput { A3D_LOCATION(0) float4 Position : SV_POSITION; A3D_LOCATION(1) float2 TexCoord : TEXCOORD; }; /////////////////////////////////////////////////////////////////////////////////////////////////// // PSOutput structure /////////////////////////////////////////////////////////////////////////////////////////////////// struct PSOutput { A3D_LOCATION(0) float4 Color : SV_TARGET0; }; //------------------------------------------------------------------------------------------------- // Samplers and Textures //------------------------------------------------------------------------------------------------- A3D_RESOURCE(SamplerState ColorSmp, s0, 1); A3D_RESOURCE(Texture2D ColorMap, t0, 2); //------------------------------------------------------------------------------------------------- // ピクセルシェーダメインエントリーポイントです. //------------------------------------------------------------------------------------------------- PSOutput main(VSOutput input) { PSOutput output = (PSOutput)0; output.Color = ColorMap.Sample( ColorSmp, input.TexCoord ); return output; }
あとは,dxc.exeで -spirv のオプションを付けてコンパイルするだけです。
DirectX用とVulkan用のシェーダバイナリの両方が1つのシェーダコードから生成できます。
これで,GLSLともようやくサヨナラです。