着色器
本节的代码是 11-init_shaders.cpp
编译 GLSL 着色器 为 SPIR-V
Vulkan的底层着色器代码是SPIR-V。示例程序将GLSL编写的着色器代码编译为 SPIR-V,通过下面这个工具函数:
GLSLtoSPV(VK_SHADER_STAGE_VERTEX_BIT, vertShaderText, vtx_spv);
The shader source code is in the vertShaderText variable and the compiled SPIR-V is returned in vtx_spv, which is a vector of unsigned int and is suitable for storing the SPIR-V code.
着色器源码在vertShaderText变量中,编译后的SPIR-V在返回的 vtx_spv中。
vtx_spv是一个unsigned intvector。
查看样例代码,以找到这个顶点着色器的着色器源码,并注意到片段着色源码也提供了,可以用类似的调用来编译它。
还要注意,这些都是简单的着色器。顶点着色器简单地将颜色传递给它的输出,并通过我们在前几节中看到的MVP变换来转换传入的顶点。片段着色器更简单,只是传递颜色。
在这个简单的示例中,只有两个着色阶段:顶点和片段阶段,以info.shaderStages的顺序存储。
创建 Vulkan 着色器模块
编译后的着色代码通过创建一个VkShaderModule并将其存储在一个VkPipelineShaderStageCreateInfo结构中,这个结构将在另一个示例中使用,并作为创建整个图形管道的一部分。
VkShaderModuleCreateInfo moduleCreateInfo;
moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
moduleCreateInfo.pNext = NULL;
moduleCreateInfo.flags = 0;
moduleCreateInfo.codeSize = vtx_spv.size() * sizeof(unsigned int);
moduleCreateInfo.pCode = vtx_spv.data();
res = vkCreateShaderModule(info.device, &moduleCreateInfo, NULL,
&info.shaderStages[0].module);
注意,从GLSL到SPIR-V转换的代码用于创建着色器模块。同样的过程被用来为片段着色器创建一个 vkShaderModule,它存储在info.shaderStages[1].module中。
在此期间还执行了管道着色阶段创建信息的一些额外初始化:
info.shaderStages[0].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
info.shaderStages[0].pNext = NULL;
info.shaderStages[0].pSpecializationInfo = NULL;
info.shaderStages[0].flags = 0;
info.shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
info.shaderStages[0].pName = "main";
到这里,着色器已经可以使用了。
© Copyright 2016 LunarG, Inc
本文介绍如何将GLSL着色器代码编译为SPIR-V,这是Vulkan使用的底层着色器代码格式。通过示例程序,我们了解到顶点和片段着色器的编译过程,以及如何创建VkShaderModule并将编译后的SPIR-V代码存储其中。此外,还介绍了如何初始化管道着色阶段创建信息。
1232

被折叠的 条评论
为什么被折叠?



