我有这种使用dndxc将 hlsl 着色器编译为 SPIR-V 的方法:
public static string LoadShader(string filename, Shader.Stage stage, string entrypoint) {
List<string> args = new List<string>();
args.Add("-spirv");
args.Add("-fspv-target-env=vulkan1.1");
IDxcOperationResult result = compiler.Compile(
library.CreateBlobFromFile(filename, IntPtr.Zero),
filename,
entrypoint, stage == Shader.Stage.Vertex ? "vs_6_2" : stage == Shader.Stage.Fragment ? "ps_6_2" : "cs_6_2",
args.ToArray(), args.Count,
null, 0,
library.CreateIncludeHandler()
);
if(result.GetStatus() != 0) {
throw new Exception(GetStringFromBlob(result.GetErrors()));
}
return GetStringFromBlob(result.GetResult());
}
这似乎生成了有效的 spirv 源,但是稍后在程序中将它传递给 SPIR-V cross(或者就此而言,通过命令行上的二进制文件)会产生这个错误:Compilation failed: SPIR-V instruction goes out of bounds.
我真的被这个错误难住了;任何帮助将非常感激。