Есть ли хороший HLSL для компилятора SPIR-V?

#vulkan #hlsl #spir-v

Вопрос:

Я пишу воксельный движок на C и внедряю визуализатор Vulkan. Я решил написать шейдеры на HLSL и перевести их с помощью SPIRV-Cross. Однако это приводит меня к проблеме — компилятор HLSL от glslang не допускает сэмплеров. Например, этот пиксельный шейдер:

 uniform sampler2D tex;
float4 main(float2 uv : TEXCOORD0) : COLOR0 {
    return tex2D(tex, uv);
}
 

выдает этот вывод компилятора:

 Expected Sampled Image to be of type OpTypeSampledImage
   = OpImageSampleImplicitLod %v4float  
 

Я не знаю, следует ли мне писать свои шейдеры в GLSL или использовать другую библиотеку. Любая помощь будет признательна.

Комментарии:

1. Используется ли HLSL sampler2D в качестве типа?

2. @NicolBolas, насколько я знаю, да.

3. @YodaSoda1219 Никол прав, использует HLSL SamplerState .

Ответ №1:

Официальный компилятор шейдеров DirectX (он предназначен для HLSL 6 и выше, а не для старого DxCompiler) фактически поддерживает преобразование HLSL в SPIR-V. Смотрите их вики-страницу об этом для объяснения того, как создать компилятор с включенной этой функцией и как ее использовать.

Тем не менее, uniform sampler2D tex; на самом деле это не HLSL, а код GLSL. В HLSL вы бы написали

 SamplerState sampler;
Texture2D tex;
float4 main(float2 uv : TEXCOORD0) : COLOR0 {
    return tex.Sample(sampler, uv);
}