使用GLSL着色器的Vulkan教程

3

我复制并粘贴了这个Vulkan教程中的代码,试图拆解它并理解Vulkan API。但是我无法使其在没有错误的情况下运行。

如果我禁用验证,代码可以按照预期运行。但是,如果启用验证,我会得到以下错误:

validation layer: SPIR-V module not valid: Codesize must be a multiple of 4 but is 421. The Vulkan spec states: If pCode points to SPIR-V code, codeSize must be a multiple of 4 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkShaderModuleCreateInfo-pCode-01376

如果我理解正确的话,这是LunarSDK验证检查之一。

因此,我认为我必须请求一个Vulkan扩展来处理GLSL着色器,而不是Spir-v,但我不确定如何做到这一点,因为这是我第一次处理API,我不知道我要寻找什么代码。我尝试阅读教程和文档,但我找不到如何解决问题。

2个回答

6

Vulkan希望使用SPIR-V着色器(标准便携式中间表示)。只有通过扩展,vulkan实现才允许其他着色器输入。 Khronos组提供了一个GLSL-> SPIR-V编译器,您可以将其嵌入到应用程序中并在运行时编译,或在构建时进行预编译并随应用程序一起发布。该编译器随LunarGSDK一起发布。 glslang编译器的使用在这里的Vulkan教程中有说明。您可以通过以下命令进行编译:

/path/to/glsllanvalidator/glslangValidator.exe -V shader.frag

我相信你必须使用正确的文件扩展名(.frag、.vert、.comp等,这在OpenGL中没有使用)以便编译器识别着色器。有关独立编译器的更多信息可以在此处找到。使用此方法,您将在构建步骤中运行glslangValidator
要将编译器嵌入应用程序中,您可以使用此答案中找到的资源,并使用像shaderc这样的帮助库,或者您可以使用直接使用glslang进行嵌入。
SPIR-V是一种低级汇编语言,用二进制文件表示并提供给Vulkan驱动程序。驱动程序可以即时编译着色器,使您拥有相同的着色器代码,无论使用哪个Vulkan驱动程序。这里的不同之处在于,如果给出了人类可读的文本表示形式的代码,则驱动程序不必执行所有所需的编译步骤,驱动程序只需要理解这种低级汇编表示形式。这允许开发人员使用编译为SPIR-V的任何语言前端(现在包括HLSL)。作为额外的好处,这消除了减少驱动程序维护者的主要错误源的巨大开销,并意味着您不需要将程序存储为可以轻松提取的纯文本,当您发布应用程序时。

2
要在Vulkan中使用GLSL着色器,需要启用并使用特定的扩展(我不记得它的名字了,稍后会检查)。但据我所知,支持它的供应商并不太多。最初由Nvidia创建,但我认为他们甚至停止了对其的支持。核心Vulkan API仅支持SPIR-V着色器。但是将GLSL转换为SPIR-V并不难。

2
只有 NVIDIA 支持直接使用 GLSL,并在几个月前已弃用该扩展(VK_NV_glsl_shader)。 - Sascha Willems

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接