创建着色器模块
译者注:示例代码点击此处
创建管道对象的第一步是准备着色器模块。 它们代表着色器并包含用SPIR-V程序集编写的代码。 单个模块可以包含多个着色器阶段的代码。 当我们编写着色器程序并将它们转换为SPIR-V形式时,我们需要创建一个着色器模块(或多个模块),然后才能在我们的应用程序中使用着色器。
怎么做...
1.获取存储在名为logical_device的VkDevice类型变量中的逻辑设备的句柄。
2.加载所选着色器的二进制SPIR-V程序集,并将其存储在名为source_code的std::vector<unsigned char>类型变量中。
3.创建名为shader_module_create_info的VkShaderModuleCreateInfo类型变量。 使用以下值初始化其成员:
·sTyle为VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO
·pNext为nullptr
·flags为0
·codeSize为source_code向量中的元素数(以字节为单位)
·指向pCode的source_code变量的第一个元素的指针
4.创建名为shader_module的VkShaderModule类型的变量,其中将存储已创建的着色器模块的句柄。
5.调用vkCreateShaderModule( logical_device, &shader_module_create_info, nullptr, &shader_module )函数,为其提供logical_device变量,指向shader_module_create_info的指针,nullptr值和指向shader_module变量的指针。
6.确保vkCreateShaderModule()函数调用返回了一个VK_SUCCESS值,该值指示已正确创建着色器模块。
这个怎么运作...
着色器模块包含所选着色器程序的源代码 - 单个SPIR-V程序集。 它可能代表多个着色器阶段,但必须与每个阶段关联一个单独的入口点。 然后在创建管线对象时将此入口点作为参数之一提供(请参阅指定管道着色器阶段内容)。
当我们想要创建着色器模块时,我们需要使用二进制SPIR-V代码加载文件或以任何其他方式获取它。 然后我们将它提供给VkShaderModuleCreateInfo类型的变量,如下所示:
VkShaderModuleCreateInfo shader_module_create_info = {
VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO,
nullptr,
0,
source_code.size(),
reinterpret_cast<uint32_t const *>(source_code.data())
};
接下来,将指向此类变量的指针提供给vkCreateShaderModule()函数,该函数创建一个模块:
VkResult result = vkCreateShaderModule( logical_device, &shader_module_create_info, nullptr, &shader_module );
if( VK_SUCCESS != result ) {
std::cout << "Could not create a shader module." << std::endl;
return false;
}
return true;
我们只需要记住在创建着色器模块时不会编译着色器; 这是在创建管线对象时完成的。
提示:在管道对象创建期间执行着色器编译和链接。