WebGPU基础(二)内存、显存、缓冲区

156 阅读3分钟

风起提示:由于技术的发展风起云涌,需留意文章时效,2024-09-05。

回顾

上一章我们介绍了WebGPU抽象的通用模型、驻留模式与立即模式的区别、适配器和逻辑设备的概念。有了可用的逻辑设备后,如何将命令和数据从CPU侧发给GPU侧呢,就牵扯到CPU的内存、GPU的显存、缓冲区,以及消息总线。

引入概念

在使用WebGPU时,会遇到各种和内存与显存相关的概念,如:命令缓冲区、顶点缓冲区、索引缓冲区、统一缓冲区、存储缓冲区、纹理、采样器,这些都是啥?

命令缓冲区(Command Buffer)

命令缓冲区(Command Buffer)通常是在系统内存中创建的,它由应用程序用来记录一系列渲染命令。这些命令包括但不限于绘制调用、设置渲染状态、更新缓冲区数据等。一旦命令缓冲区被记录完成,它会被提交给GPU进行处理。

在现代图形API(如Vulkan、DirectX 12)中,为了提高性能,命令缓冲区的记录可能会在一个CPU可访问的内存区域中进行,这个区域不是GPU显存的一部分。然后,这个命令缓冲区会被提交到GPU,某些情况下可能会被复制到GPU可以直接访问的内存中,但这并非总是必要的,因为许多现代架构允许GPU直接从系统内存中读取命令缓冲区。

简单来说,命令缓冲区主要存在于系统的主内存中,而不是GPU的显存中。不过,在命令缓冲区提交给GPU执行的过程中,部分数据可能会暂时驻留在GPU的内部缓存或显存中,以便GPU可以快速访问这些命令来进行处理。

顶点缓冲区(Vertex Buffer

用于存储顶点数据(例如位置、颜色、法线、纹理坐标等),这些数据通常会存储在GPU显存中,以便GPU可以快速访问并在渲染过程中使用。

索引缓冲区(Index Buffer

存储了索引数据,这些索引指向顶点缓冲区中的顶点,使用索引是为了减少重复的顶点数据。索引缓冲区也一般位于GPU显存中。

统一缓冲区(Uniform Buffer

主要用于存储不变的数据,这些数据在整个绘制调用期间保持不变,但在不同的绘制调用之间可以更新。它们主要用于读取操作,不支持写入。统一缓冲区同样位于GPU显存中。

存储缓冲区(Storage Buffer

存储缓冲区则更加灵活,可以存储任意类型的数据,并且支持读写操作。它们适用于需要在着色器之间共享和修改数据的场景。存储缓冲区也会放在GPU显存中。

纹理(Texture

是一种存储在GPU显存中的二维数组,通常用于存储图像数据,着色器可以从这些纹理中采样数据来实现各种效果。

采样器(Sampler

并不是直接的数据存储,而是一种描述如何从纹理中读取数据的对象。采样器定义了过滤方式、地址模式等属性,通常不占用大量的显存空间。

综上所述

顶点缓冲区、索引缓冲区、统一缓冲区、存储缓冲区和纹理通常是存储在GPU显存中的数据结构,以便GPU能够高效地访问这些数据进行渲染操作。命令缓冲区通常在系统内存中,并不直接占据显存空间。而采样器则更多地是一个逻辑对象,用于控制如何访问纹理数据。

更多精彩内容可关注风起的博客,微信公众号:听风说图