将 GLSL 编译为相应的 Spir V,以便在 Vulkan 应用程序中使用
Compiling GLSL to corresponding Spir V for use in a Vulkan Application
我正在使用来自 github 的 Jonno Robson 的 Vulkan 代码库:Vulkan-Terrain-Generator 作为指南和/或学习参考,以更好地理解 Vulkan。我对源代码本身没有任何问题,但我的问题或疑虑与将 GLSL 着色器代码编译成 Spir V 代码有关。我是 SpirV 的编译器和工具包的新手。我试过同时使用:glslangValidator.exe 和 glslc.exe 将着色器文件转换为 Spir V 文件。
在 Jonno 的代码库中,他将每个 GLSL 着色器文件转换为相应的 spirv 文件。我尝试使用他在他的批处理文件中使用的标志选项,唯一的区别是我用我自己的目录替换了指向他的 glslangValidator.exe 的目录。
我正在尝试实现相同的效果,它会将批处理文件目录中的所有着色器文件从 GLSL 编译到 Spir V,然后将 .spv
附加到在将其从 GLSL 转换为受人尊敬的 Spir V 字节代码后,它将在该目录中生成的每个新 SpirV 文件的末尾。
这是我的批处理文件的样子:
compile.bat
C:\VulkanSDK\Bin\glslangValidator.exe -V %1 -o %1.spv
pause
但是在我双击批处理文件后它对我不起作用。它会打开并运行,但不会生成预期的 shader_filename.vert.spv
... shader_filename.frag.spv
文件。
我不知道他们是在什么平台上做的,但我是 运行 Windows 7,我不知道这对命令参数或标志是否有影响在批处理命令中被馈送。我不知道他们是否使用了 Vulkan SDK 中的任何其他工具包或一些外部库或工具或其他什么。
我希望能够使用这个批处理文件执行的操作是使用最简单的批处理命令将所有着色器文件转换为适当的 Spir V 文件。我不想为每个着色器文件一遍又一遍地编写相同的命令,因为此目录中有 20 多个着色器。
我如何实现这一点,或者 glslangValidator 或 glslc 生成所需 SpirV 文件的正确命令参数是什么?
我已阅读此处找到的文档:SPIR-V Toolchain 但我仍然不确定如何正确生成所需的批处理文件。
您需要确保为每个文件提供一个输入名称,该示例仅使用 %1,然后从命令行作为参数发出,例如:
mybatch.bat inputfile.frag
如果您打算直接双击它,我们需要对其进行更改。它将允许您循环遍历您想要对其执行此操作的每个文件:
@echo off
for %%i in (*.vert *.frag) do "C:\VulkanSDK\Bin\glslangValidator.exe" -V "%%~i" -o "%%~i.spv"
它所做的是获取每个 .vert
和 .frag
并将其分配给元变量 %%i
然后我们只需为每个发出命令,直到我们遍历每个文件。
您可以阅读有关元变量的更多信息,以及如何在从 cmd.exe
执行 for /?
时扩展它们
这是摘录。
您现在可以使用以下可选语法:
%~I - expands %I removing any surrounding quotes (")
%~fI - expands %I to a fully qualified path name
%~dI - expands %I to a drive letter only
%~pI - expands %I to a path only
%~nI - expands %I to a file name only
%~xI - expands %I to a file extension only
%~sI - expanded path contains short names only
%~aI - expands %I to file attributes of file
%~tI - expands %I to date/time of file
%~zI - expands %I to size of file
%~$PATH:I - searches the directories listed in the PATH
environment variable and expands %I to the
fully qualified name of the first one found.
If the environment variable name is not
defined or the file is not found by the
search, then this modifier expands to the
empty string
可以组合修饰符以获得复合结果:
%~dpI - expands %I to a drive letter and path only
%~nxI - expands %I to a file name and extension only
%~fsI - expands %I to a full path name with short names only
%~dp$PATH:I - searches the directories listed in the PATH
environment variable for %I and expands to the
drive letter and path of the first one found.
%~ftzaI - expands %I to a DIR like output line
我正在使用来自 github 的 Jonno Robson 的 Vulkan 代码库:Vulkan-Terrain-Generator 作为指南和/或学习参考,以更好地理解 Vulkan。我对源代码本身没有任何问题,但我的问题或疑虑与将 GLSL 着色器代码编译成 Spir V 代码有关。我是 SpirV 的编译器和工具包的新手。我试过同时使用:glslangValidator.exe 和 glslc.exe 将着色器文件转换为 Spir V 文件。
在 Jonno 的代码库中,他将每个 GLSL 着色器文件转换为相应的 spirv 文件。我尝试使用他在他的批处理文件中使用的标志选项,唯一的区别是我用我自己的目录替换了指向他的 glslangValidator.exe 的目录。
我正在尝试实现相同的效果,它会将批处理文件目录中的所有着色器文件从 GLSL 编译到 Spir V,然后将 .spv
附加到在将其从 GLSL 转换为受人尊敬的 Spir V 字节代码后,它将在该目录中生成的每个新 SpirV 文件的末尾。
这是我的批处理文件的样子:
compile.bat
C:\VulkanSDK\Bin\glslangValidator.exe -V %1 -o %1.spv
pause
但是在我双击批处理文件后它对我不起作用。它会打开并运行,但不会生成预期的 shader_filename.vert.spv
... shader_filename.frag.spv
文件。
我不知道他们是在什么平台上做的,但我是 运行 Windows 7,我不知道这对命令参数或标志是否有影响在批处理命令中被馈送。我不知道他们是否使用了 Vulkan SDK 中的任何其他工具包或一些外部库或工具或其他什么。
我希望能够使用这个批处理文件执行的操作是使用最简单的批处理命令将所有着色器文件转换为适当的 Spir V 文件。我不想为每个着色器文件一遍又一遍地编写相同的命令,因为此目录中有 20 多个着色器。
我如何实现这一点,或者 glslangValidator 或 glslc 生成所需 SpirV 文件的正确命令参数是什么?
我已阅读此处找到的文档:SPIR-V Toolchain 但我仍然不确定如何正确生成所需的批处理文件。
您需要确保为每个文件提供一个输入名称,该示例仅使用 %1,然后从命令行作为参数发出,例如:
mybatch.bat inputfile.frag
如果您打算直接双击它,我们需要对其进行更改。它将允许您循环遍历您想要对其执行此操作的每个文件:
@echo off
for %%i in (*.vert *.frag) do "C:\VulkanSDK\Bin\glslangValidator.exe" -V "%%~i" -o "%%~i.spv"
它所做的是获取每个 .vert
和 .frag
并将其分配给元变量 %%i
然后我们只需为每个发出命令,直到我们遍历每个文件。
您可以阅读有关元变量的更多信息,以及如何在从 cmd.exe
for /?
时扩展它们
这是摘录。
您现在可以使用以下可选语法:
%~I - expands %I removing any surrounding quotes (")
%~fI - expands %I to a fully qualified path name
%~dI - expands %I to a drive letter only
%~pI - expands %I to a path only
%~nI - expands %I to a file name only
%~xI - expands %I to a file extension only
%~sI - expanded path contains short names only
%~aI - expands %I to file attributes of file
%~tI - expands %I to date/time of file
%~zI - expands %I to size of file
%~$PATH:I - searches the directories listed in the PATH
environment variable and expands %I to the
fully qualified name of the first one found.
If the environment variable name is not
defined or the file is not found by the
search, then this modifier expands to the
empty string
可以组合修饰符以获得复合结果:
%~dpI - expands %I to a drive letter and path only
%~nxI - expands %I to a file name and extension only
%~fsI - expands %I to a full path name with short names only
%~dp$PATH:I - searches the directories listed in the PATH
environment variable for %I and expands to the
drive letter and path of the first one found.
%~ftzaI - expands %I to a DIR like output line