WebGPU | 相关知识概述


首先看下WebGPU的目标:

  • 同时支持实时屏幕渲染和离屏渲染。

  • 使通用计算能够在 GPU 上高效执行。

  • 支持针对各种原生 GPU API 的实现:Microsoft 的 D3D12、Apple 的 Metal 和 Khronos 的 Vulkan。

  • 提供一种人类可创作的语言来指定在 GPU 上运行的计算。

  • 可在浏览器的多进程架构中实现,维护Web的安全性。

  • 尽可能让应用程序在不同的用户系统和浏览器之间可移植地工作。

  • 以有用但范围仔细的方式与 Web 平台的其余部分交互(基本上以一种或另一种方式共享图像)。

  • 提供在 Web 上公开现代 GPU 功能的基础。 WebGPU 的结构类似于所有当前的原生 GPU API,即使它不提供它们的所有功能。 有计划稍后扩展它以具有更现代的功能。

非目标:

  • 公开对根本不可编程或灵活性较差的硬件的支持,例如 DSP 或专门的机器学习硬件。

  • 公开支持不能进行通用计算的硬件(如旧手机 GPU 甚至旧台式机 GPU)。

  • 彻底公开本机 GPU API 上可用的所有功能(某些功能仅在单一供应商的 GPU 上可用,或者太小众而无法添加到 WebGPU)。

  • 允许广泛混合和匹配 WebGL 和 WebGPU 代码。

  • 与 CSS Houdini 等页面渲染流程紧密集成。

适配器和设备

WebGPU“适配器”(GPUAdapter)是一个对象,用于标识系统上的特定 WebGPU 实现(例如,集成或离散 GPU 上的硬件加速实现,或软件实现)。 同一页面上的两个不同的“GPUAdapter”对象可以指代同一个底层实现,或指两个不同的底层实现(例如集成和离散 GPU)。

页面可见的适配器集由用户代理决定。

WebGPU“设备”(GPUDevice)表示与WebGPU适配器的逻辑连接。 之所以称为“设备”,是因为它抽象了底层实现(例如视频卡)并封装了单个连接:拥有设备的代码可以充当适配器的唯一用户。

作为这种封装的一部分,设备是从它创建的所有 WebGPU 对象(纹理等)的根所有者,只要设备丢失或损坏,就可以(内部)释放这些对象。 单个网页上的多个组件可以各自拥有自己的 WebGPU 设备。

所有 WebGPU 的使用都是通过 WebGPU 设备或从它创建的对象完成的。 从这个意义上说,它服务于“WebGLRenderingContext”目的的一个子集; 然而,与 WebGLRenderingContext 不同的是,它不与画布对象相关联,并且大多数命令是通过“子”对象发出的。

 

GPU缓冲区创建

有两种缓冲区创建存储顶点位置、颜色、法线、uv数据信息;

第一种:分别创建两个或多个缓冲区,用来表示顶点位置、颜色,法线、uv数据信息并调用;

第二种:在数据层面,创建一个gpubuffer,要比创建多个零散的gpubuffer效率高很多,减少cpu与gpu的交换数据次数,也减少了GPU在内部命中内存的速度,这个的提升也很重要;但同样他也有缺点,他不能很好的处理程序重复使用,例如,对于一个三维立方体有多个不同颜色的表面,单一gpu缓冲区要求同一面上的不同顶点,多次重复相同的颜色信息,这就需要更大的储存空间,并且浪费GPU和CPU的资源。

字节说明

32位机:一个字长有4个字节;

缓冲区属性:

GPUBufferUsage(缓冲区使用):

GPUBufferUsage.VERTEX 指的是你定义的缓冲区可以成为绘制操作中的顶点缓冲区。

GPUBufferUsage.COPY_DST指的是当你复制缓冲区的时候, 你定义的缓冲区可以用于目标缓冲区(destination buffer), 也就是允许将数据复制到你定义的缓冲区