Vulkan Cookbook 第五章 8 创建存储缓冲区

创建存储缓冲区

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

当我们不仅想从着色器中的缓冲区中读取数据,而且想在其中存储数据时,需要使用存储缓冲区。这些是使用VK_BUFFER_USAGE_STORAGE_BUFFER_BIT创建的。

怎么做...

  1. 获取物理设备句柄并存储在名为physical_device的VkPhysicalDevice变量中。
  2. 创建一个名为storage_buffer的VkBuffer类型变量我们将在其中存储创建的存储缓冲区句柄。
  3. 使用logical_device变量创建所需大小和用法的缓冲区。指定用法必须包含一个VK_BUFFER_USAGE_STORAGE_BUFFER_BIT标志。将创建的句柄存储在storage_buffer变量中(请参阅第四章,资源和内存中的创建缓冲区内容)。
  4. 使用VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT属性分配内存对象(或使用现有内存对象的部分范围)并将其绑定到创建的缓冲区(请参阅第4章,资源和内存中的为缓冲区分配和绑定内存对象内容)。

这个怎么运作...

存储缓冲区支持读写操作。我们还可以对具有无符号整数格式的存储缓冲区成员执行原子操作。

提示:存储缓冲区对应于VK_DESCRIPTOR_TYPE_STORAGE_BUFFER或VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC描述符类型。

存储缓冲区成员的数据必须放在适当的偏移量处。满足要求的最简单方法是遵从GLSL语言中的std430布局规则。存储缓冲区的基本对齐规则类似于统一缓冲区的规则。但是数组和结构体除外-它们的偏移量不需要四舍五入到16的倍数。为方便起见,这些规则指定如下:

  • 大小为N的标量变量必须放置在N的倍数的偏移处
  • 具有两个分量的向量,其中每个分量的大小为N,必须放置在2N的倍数的偏移处
  • 具有三个或四个分量的向量,其中每个分量的大小为N,必须放置在4N倍数的偏移处
  • 具有大小为N的元素的数组必须放置在N的倍数的偏移处
  • 结构体的偏移处,必须被放置在其任何成员(具有最大偏移量需求的成员)的最大偏移量的倍数处 。
  • 行主序矩阵必须放置在等于向量偏移量的偏移处,其中分量数等于矩阵中的列数。
  • 列主序矩阵必须放置在与其列相同的偏移处

动态存储缓冲区(Dynamic storage buffers)与普通存储缓冲区的基础内存偏移的定义方式不同。在描述符更新期间指定的偏移量和范围对于普通存储缓冲区保持不变,直到下一次更新,在其动态变化的情况下,指定偏移量变为基础地址,稍后可以通过在描述符集绑定到命令缓冲区时添加的动态偏移量来修改基偏移。

提示:在GLSL着色器中,存储缓冲区和动态存储缓冲区的定义于缓冲区限定符和语法块相同。

GLSL着色器中使用的存储缓冲区示例如下:


layout (set=m, binding=n) buffer <variable name> {
  vec4 <member 1 name>; 
  mat4 <member 2 name>; 
  // ...
};
          

猜你喜欢

转载自blog.csdn.net/qq_19473837/article/details/85259551
今日推荐