Vulkan 学习(19)---- Vulkan Compute

Vulkan Compute 概述

OpenGL 等较旧的 API 不同,Vulkan 中强制要求支持计算着色器,这意味着您可以在任何可用的 Vulkan 实现上使用计算着色器,无论它是高端桌面 GPU 还是低功耗嵌入式设备
GPU 的计算功能可以用于图像处理、可见性测试、后期处理、高级照明计算、动画、物理(例如粒子系统)等等,甚至可以用于非可见性的工作比如 AI 和 数字运算等

使用 GPU 进行计算的一个明显的优势是

  • 降低 CPU 负载
  • 避免 CPUGPU 之间交换数据
    所有数据都可以直接保持在 GPU 上,无需从缓慢的主存储器中获取数据

一个例子

我们将实现的一个易于理解的示例是基于 GPU 的粒子系统,这种系统在很多游戏中会与使用,通常由数千个每帧都更新的粒子组成,渲染粒子需要两个主要的过程: 使用顶点缓冲区传递顶点,粒子的计算和更新

传统的粒子系统是将粒子数据存储在主内存中,然后使用 CPU 更新,更新后,顶点需要再次传输到 GPU 的内存,以便它可以在下一帧中显示更新的粒子
最直接的方法是为每帧使用新数据重新创建顶点缓冲区。这显然非常耗费资源,当然也可以映射 GPU 的内存方便 CPU 写入,或者使用主机本地缓冲区(由于 PCI-E 带宽,这将是最慢的方法),但是无论使用那种方法,始终需要 CPUGPU 之间交换数据来更新粒子

使用基于 GPU 的粒子系统,就不需要此过程,顶点上传到 GPU,并且所有更新都在 GPU 的内存中使用计算着色器完成,之所以速度更快的主要原因之一是 GPU 与直接管理的内存(Local Memory)之间更高的带宽

同时在具有专门计算队列的 GPU 上执行时,可以与图形管线并行执行来更新粒子

使用流程

前面已经了解了用于传递图元的顶点和索引的缓冲区(vertebufferindexbuffer)以及用于将数据传递到着色器的统一缓冲区(uniform buffer)
Vulkan Compute 引入的一个重要概念是能够任意地从缓冲区读取和写入到缓冲区, 为此,Vulkan 提供了两种专用的存储类型 SSBO(Shader Storage Buffer Object) 和 vkImage

SSBO

SSBO(Shader Storage Buffer Object) 是允许计算着色器读取和写入的缓冲区,使用它们类似于使用统一缓冲区对象
区别于之前我们使用的 VertexBuffer IndexBufferTexture Mapping Image 都是 Shader 只读类型的 Buffer

Uniform Buffer 也是 Shader 可读可写的,但是大小必须和 Graphic Shader 中定义的一致,
但是 SSBO 的特点就是大小不限定,也就是大小可以根据要处理的数据量决定,要处理数据越多,创建的 SSBO buffers size 越大

Vulkan 中,您可以为缓冲区和图像指定多种用途,因此粒子顶点缓冲区既可以用作顶点缓冲区(在图形通道中),又可以用作存储缓冲区(在计算通道中)

// 作为 SSBO Usage VK_BUFFER_USAGE_STORAGE_BUFFER_BIT
createBuffer(bufferSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, shaderStorageBuffers[i], shaderStorageBuffersMemory[i]);

void createBuffer(VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties, VkBuffer& buffer, VkDeviceMemory& bufferMemory) {
   
   
    VkBufferCreateInfo bufferInfo{
   
   };
    bufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
    bufferInfo.size = size;
    bufferInfo.usage = usage;
    bufferInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;

    if (vkCreateBuffer(device, &bufferInfo, nullptr, &buffer) != VK_SUCCESS) {
   
   
        throw std::runtime_error("failed to create buffer!");
    }

    VkMemoryRequirements memRequirements
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值