簡體   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