带有 glsl 着色器的 Vulkan 教程
Vulkan tutorial with glsl shaders
我复制粘贴了 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 而且我不知道不知道我在找什么代码。我尝试阅读教程和文档,但找不到修复方法。
要在 Vulkan 中使用 GLSL 着色器,您需要启用并使用特定的扩展(我不记得它的名字,稍后会检查)。但据我所知,支持它的厂商并不多。它最初是由 Nvidia 创建的,但我认为他们甚至不再支持它。核心 Vulkan API 仅支持 SPIR-V 着色器。但是将 GLSL 转换为 SPIR-V 并不难。
Vulkan 预计 SPIR-V shaders (Standard Portable Intermediate Representation). Only through extensions do vulkan implementations allow other inputs for shaders. Khronos group has provided a GLSL -> SPIR-V compiler which you can either embed into your application and compile at runtime, or precompile on build and ship with your application. This compiler ships with the LunarGSDK. Use of the glslang compiler is explained in the Vulkan Tutorial here。你可以通过命令编译:
/path/to/glsllanvalidator/glslangValidator.exe -V shader.frag
我相信您必须使用正确的文件扩展名(.frag、.vert、.comp 等,在 OpenGL 中未使用),编译器才能识别着色器。有关独立编译器的更多信息 can be found here。使用此方法,您将 运行 glslangValidator
作为构建步骤的一部分。
要将编译器嵌入到您的应用程序中,您可以使用找到的资源 and use helper libraries like shaderc, or you can embed it yourself by using glslang directly。
SPIR-V 是一种低级汇编语言,由提供给 vulkan 驱动程序的二进制文件表示。然后驱动程序可以 JIT compile the shader, allowing you to have the same shader code no matter the vulkan driver. What's different here is that the driver isn't forced to carry out all the compilation steps required if they were given a human readable text representation of the code The driver only needs to understand this low level assembly representation. This allows the developer to use what ever language front end that compiles to SPIR-V (which now includes HLSL)。作为一个额外的好处,这从驱动程序中消除了巨大的开销,从而减少了驱动程序维护者的主要错误来源,并且意味着您不需要将程序存储为可以在发布应用程序时轻松提取的纯文本.
我复制粘贴了 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 而且我不知道不知道我在找什么代码。我尝试阅读教程和文档,但找不到修复方法。
要在 Vulkan 中使用 GLSL 着色器,您需要启用并使用特定的扩展(我不记得它的名字,稍后会检查)。但据我所知,支持它的厂商并不多。它最初是由 Nvidia 创建的,但我认为他们甚至不再支持它。核心 Vulkan API 仅支持 SPIR-V 着色器。但是将 GLSL 转换为 SPIR-V 并不难。
Vulkan 预计 SPIR-V shaders (Standard Portable Intermediate Representation). Only through extensions do vulkan implementations allow other inputs for shaders. Khronos group has provided a GLSL -> SPIR-V compiler which you can either embed into your application and compile at runtime, or precompile on build and ship with your application. This compiler ships with the LunarGSDK. Use of the glslang compiler is explained in the Vulkan Tutorial here。你可以通过命令编译:
/path/to/glsllanvalidator/glslangValidator.exe -V shader.frag
我相信您必须使用正确的文件扩展名(.frag、.vert、.comp 等,在 OpenGL 中未使用),编译器才能识别着色器。有关独立编译器的更多信息 can be found here。使用此方法,您将 运行 glslangValidator
作为构建步骤的一部分。
要将编译器嵌入到您的应用程序中,您可以使用找到的资源
SPIR-V 是一种低级汇编语言,由提供给 vulkan 驱动程序的二进制文件表示。然后驱动程序可以 JIT compile the shader, allowing you to have the same shader code no matter the vulkan driver. What's different here is that the driver isn't forced to carry out all the compilation steps required if they were given a human readable text representation of the code The driver only needs to understand this low level assembly representation. This allows the developer to use what ever language front end that compiles to SPIR-V (which now includes HLSL)。作为一个额外的好处,这从驱动程序中消除了巨大的开销,从而减少了驱动程序维护者的主要错误来源,并且意味着您不需要将程序存储为可以在发布应用程序时轻松提取的纯文本.