Vulkan【12】着色器

着色器

本节的代码是 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

你可能感兴趣的:(Vulkan)