带glsl着色器的Vulkan教程

时间:2018-11-25 19:26:18

标签: c++ runtime-error vulkan

我复制粘贴了this 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 个答案:

答案 0 :(得分:3)

Vulkan期望SPIR-V shaders (Standard Portable Intermediate Representation)。仅通过扩展,vulkan实现才允许着色器的其他输入。 Khronos小组提供了GLSL-> SPIR-V编译器,您可以将其嵌入应用程序中并在运行时进行编译,也可以在构建时预编译并随应用程序一起提供。该编译器随LunarGSDK一起提供。 glslang中说明了Vulkan Tutorial here编译器的使用。您可以通过以下命令进行编译:

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

我相信您必须使用正确的文件扩展名(.frag,.vert..comp等。在OpenGL中未使用),编译器才能识别着色器。有关独立编译器can be found here的更多信息。使用此方法,您将在构建步骤中运行glslangValidator

要将编译器嵌入到您的应用程序中,可以使用找到的资源in this answer和使用诸如shaderc之类的帮助程序库,也可以使用glslang directly自己嵌入它。

SPIR-V是一种低级汇编语言,它由提供给vulkan驱动程序的二进制文件表示。然后,驱动程序可以JIT compile the shader,无论vulkan驱动程序如何,都可以使用相同的着色器代码。此处的不同之处在于,如果驱动程序被赋予了人类可读的代码文本表示形式,则不必强迫驱动程序执行所有必需的编译步骤。驱动程序只需要了解这种低级汇编表示形式即可。这使开发人员可以使用编译到SPIR-V(现在包括HLSL)的任何语言的前端。另外一个好处是,这消除了驱动程序的巨大开销,从而减少了驱动程序维护人员的主要错误来源,并且意味着您无需将程序存储为纯文本,而这些文本可以在发布应用程序时轻松提取出来。 。

答案 1 :(得分:2)

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