繁体   English   中英

带glsl着色器的Vulkan教程

[英]Vulkan tutorial with glsl shaders

我在 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,而且我不知道我要查找的代码是什么。 我尝试阅读本教程和文档,但找不到解决方法。

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

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

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

要将编译器嵌入到您的应用程序中,您可以使用此答案中的资源并使用诸如shaderc之类的帮助程序库,也可以直接使用glslang自己将其嵌入。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM