こんにちわ,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ともようやくサヨナラです。