Vulkan Cookbook 第八章 1 创建着色器模块

创建着色器模块

译者注:示例代码点击此处

创建管道对象的第一步是准备着色器模块。 它们代表着色器并包含用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;

我们只需要记住在创建着色器模块时不会编译着色器; 这是在创建管线对象时完成的。

提示:在管道对象创建期间执行着色器编译和链接。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值