WebGPU入门初识

news2024/12/28 14:55:49

什么是 WebGPU?

WebGPU 是一种现代图形 API,旨在取代 WebGL,提供更高性能和更灵活的 GPU 加速能力。它基于 Vulkan、Metal 和 Direct3D 12,为 Web 开发者带来了类似于原生图形 API 的性能和控制力。

与 WebGL 不同,WebGPU 提供了对计算着色器和低级 GPU 操作的直接支持,使开发者能够充分利用 GPU的潜力来处理图形渲染和并行计算任务。


WebGPU 基本概念详解

在 WebGPU 开发中,理解其核心概念至关重要。以下是 WebGPU 的基本概念及相应的实例代码,帮助初学者直观理解。


1. GPU 适配器(GPUAdapter)和设备(GPUDevice)

概念

  • GPUAdapter:表示浏览器访问到的可用 GPU,类似于桥梁,连接 Web 应用与底层硬件。
  • GPUDevice:表示具体的 GPU 设备,用于执行渲染或计算任务。

示例

const adapter = await navigator.gpu.requestAdapter(); // 获取适配器
const device = await adapter.requestDevice();        // 请求设备
console.log("Adapter:", adapter);
console.log("Device:", device);

2. 管线(Pipeline)

概念

  • 渲染管线(Render Pipeline):定义顶点着色器和片元着色器的工作流程。
  • 计算管线(Compute Pipeline):专用于非图形任务的 GPU 计算。

渲染管线示例

const pipeline = device.createRenderPipeline({
  vertex: {
    module: shaderModule,
    entryPoint: "vertex_main",
  },
  fragment: {
    module: shaderModule,
    entryPoint: "fragment_main",
    targets: [{ format: "bgra8unorm" }],
  },
  primitive: {
    topology: "triangle-list", // 图元类型
  },
});
console.log("Pipeline Created:", pipeline);

3. 着色器(Shader)

概念

  • 着色器是运行在 GPU 上的程序,用于处理图形数据。WebGPU 使用 WGSL 编写。
  • 常见的着色器类型:
    • 顶点着色器:处理每个顶点的位置。
    • 片元着色器:计算像素的颜色。

示例

const shaderCode = `
  @vertex
  fn vertex_main(@location(0) position: vec4<f32>) -> @builtin(position) vec4<f32> {
    return position; // 顶点位置传递给片元着色器
  }

  @fragment
  fn fragment_main() -> @location(0) vec4<f32> {
    return vec4(1.0, 0.0, 0.0, 1.0); // 输出红色
  }
`;
const shaderModule = device.createShaderModule({ code: shaderCode });
console.log("Shader Module Created:", shaderModule);

4. 命令编码器(Command Encoder)

概念

  • 用于生成命令缓冲区,将渲染或计算任务发送到 GPU 执行。

示例

const commandEncoder = device.createCommandEncoder();
const passEncoder = commandEncoder.beginRenderPass({
  colorAttachments: [{
    view: context.getCurrentTexture().createView(),
    loadOp: "clear", // 清除屏幕
    clearValue: { r: 0.1, g: 0.2, b: 0.3, a: 1.0 }, // 背景色
    storeOp: "store",
  }],
});

passEncoder.setPipeline(pipeline);
passEncoder.draw(3, 1, 0, 0); // 绘制三角形
passEncoder.end();
device.queue.submit([commandEncoder.finish()]);

5. 缓冲区(Buffer)

概念

  • GPU 缓冲区存储顶点数据、索引数据、常量等。
  • 数据以二进制格式存储,传递给着色器。

示例

const vertices = new Float32Array([
  0.0,  0.5, // 顶点 1
 -0.5, -0.5, // 顶点 2
  0.5, -0.5, // 顶点 3
]);

const vertexBuffer = device.createBuffer({
  size: vertices.byteLength,
  usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,
});
device.queue.writeBuffer(vertexBuffer, 0, vertices);
console.log("Vertex Buffer Created:", vertexBuffer);

6. 纹理(Texture)

概念

  • 纹理用于存储图像或多维数据,常用于渲染图片或生成复杂效果。

示例

const texture = device.createTexture({
  size: [256, 256, 1],
  format: "rgba8unorm",
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});
console.log("Texture Created:", texture);

WebGPU 基本示例

以下是一个简单的 WebGPU 应用示例,绘制一个彩色的三角形。

HTML 模板
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>WebGPU 三角形</title>
</head>
<body>
  <canvas id="gpuCanvas"></canvas>
  <script src="app.js"></script>
</body>
</html>
JavaScript 实现(app.js
(async () => {
  // 初始化 GPU
  const adapter = await navigator.gpu.requestAdapter();
  const device = await adapter.requestDevice();
  const canvas = document.getElementById("gpuCanvas");
  const context = canvas.getContext("webgpu");
  context.configure({
    device: device,
    format: "bgra8unorm",
  });

  // 顶点数据
  const vertices = new Float32Array([
    0.0,  0.5, 1.0, 0.0, 0.0, // 顶点 1:红色
   -0.5, -0.5, 0.0, 1.0, 0.0, // 顶点 2:绿色
    0.5, -0.5, 0.0, 0.0, 1.0, // 顶点 3:蓝色
  ]);
  const vertexBuffer = device.createBuffer({
    size: vertices.byteLength,
    usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,
  });
  device.queue.writeBuffer(vertexBuffer, 0, vertices);

  // 着色器代码
  const shaderCode = `
    @vertex
    fn vertex_main(@location(0) position: vec2<f32>, @location(1) color: vec3<f32>) -> @builtin(position) vec4<f32> {
      return vec4(position, 0.0, 1.0);
    }

    @fragment
    fn fragment_main(@location(1) color: vec3<f32>) -> @location(0) vec4<f32> {
      return vec4(color, 1.0);
    }
  `;
  const shaderModule = device.createShaderModule({ code: shaderCode });

  // 渲染管线
  const pipeline = device.createRenderPipeline({
    vertex: {
      module: shaderModule,
      entryPoint: "vertex_main",
      buffers: [
        {
          arrayStride: 5 * 4, // 每个顶点占 5 个 float
          attributes: [
            { shaderLocation: 0, offset: 0, format: "float32x2" }, // 位置
            { shaderLocation: 1, offset: 2 * 4, format: "float32x3" }, // 颜色
          ],
        },
      ],
    },
    fragment: {
      module: shaderModule,
      entryPoint: "fragment_main",
      targets: [{ format: "bgra8unorm" }],
    },
    primitive: { topology: "triangle-list" },
  });

  // 渲染
  const commandEncoder = device.createCommandEncoder();
  const passEncoder = commandEncoder.beginRenderPass({
    colorAttachments: [{
      view: context.getCurrentTexture().createView(),
      loadOp: "clear",
      clearValue: { r: 0.1, g: 0.1, b: 0.1, a: 1.0 },
      storeOp: "store",
    }],
  });
  passEncoder.setPipeline(pipeline);
  passEncoder.setVertexBuffer(0, vertexBuffer);
  passEncoder.draw(3, 1, 0, 0); // 绘制三角形
  passEncoder.end();
  device.queue.submit([commandEncoder.finish()]);
})();

代码解析

  1. GPU 初始化

    • navigator.gpu.requestAdapter() 请求 GPU 适配器。
    • adapter.requestDevice() 获取 GPU 设备。
  2. Canvas 配置
    使用 getPreferredCanvasFormat() 确保兼容性。

  3. 顶点数据

    • 包含位置和颜色信息。
    • 使用 Float32Array 存储。
  4. 着色器编写

    • 顶点着色器处理每个顶点的位置。
    • 片元着色器确定像素的颜色。
  5. 渲染管线
    定义顶点缓冲区格式和着色器入口。

  6. 渲染流程

    • 配置 RenderPass
    • 通过命令编码器将绘图命令提交到 GPU。

输出结果

运行代码后,您将在 Canvas 中看到一个红、绿、蓝三色的三角形。这是 WebGPU 基础应用的一个完整流程。


进一步学习方向

  1. 深入了解 WGSL
    学习 WebGPU 的着色器语言,优化渲染效果。

  2. 纹理处理
    实现纹理映射,加载外部图片。

  3. 计算着色器
    探索 WebGPU 的非图形计算能力。

  4. 性能优化
    掌握高效的资源管理和渲染技术。

欢迎各位随时交流~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2266968.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

中学数学:一个函数值计算题

在数学的领域中&#xff0c;函数是一种描述变量之间关系的桥梁&#xff0c;它能够揭示出看似复杂现象背后的简洁规律。通过函数&#xff0c;我们可以预测、分析并解决实际问题。在这张图片中&#xff0c;我们看到了一位数学爱好者手写的解题过程&#xff0c;它展示了如何巧妙地…

kipotix4靶机实战

信息收集 1.判断靶机ip 原理&#xff1a;开靶机之前nmap扫一次网段&#xff0c;再开靶机之后扫一次&#xff0c;查看多出来的ip就是靶机ip ip192.168.98.1742.判断端口服务&#xff0c;系统版本 a.确定端口 b.-p指定端口进一步收集 c.信息筛选 1.端口&#xff1a;22,80,139,…

Xilinx FPGA的Bitstream比特流加密设置方法

关于Xilinx FPGA的Bitstream比特流加密设置方法更多信息可参阅应用笔记xapp1084。 使用加密bitstream分两个步骤&#xff1a; 将bitstream的AES密钥存储在FPGA芯片内将使用AES密钥加密的Bitstream通过SPI Flash或JTAG加载至FPGA芯片 AES密钥可以存储在两个存储区之一&#x…

菜鸟带新鸟——基于EPlan2022的部件库制作(3D)

设备逻辑的概念&#xff1a; 可在布局空间 中和其它对象上放置对象。可将其它对象放置在 3D 对象上。已放置的对象分到组件的逻辑结构中。 将此属性的整体标识为设备逻辑。可使用不同的功能创建和编辑设备逻辑。 设备的逻辑定义 定义 / 旋转 / 移动 / 翻转&#xff1a;组…

理解有放回和无放回抽样 (Python)

理解有放回和无放回抽样 (Python) 文章目录 一、说明二、放回抽样模型概念2.1 如何实现放回抽样2.2 使用 NumPy 进行替换抽样2.3 使用 Pandas 进行替换抽样 三、基本统计原理四、什么是无放回抽样4.1 使用 NumPy 进行无放回抽样4.1 数据科学中不重复抽样的例子 五、结论 一、说…

H5电子杂志制作工具推荐

什么样的电子杂志制作软件最好用呢&#xff1f;这里向大家介绍几款操作简易又稳定、功能满足工作的需求、效果非常精美大气的电子杂志制作软件。 1.FLBOOK&#xff1a;是一款专门为企业内刊、期刊设计的在线制作平台&#xff0c;用来制作企业电子期刊非常方便。它不需要下载安…

CAN201 Introduction to Networking(计算机网络)Pt.3 网络层

文章目录 4.Network Layter&#xff08;网络层&#xff09;4.1 Overview4.2 Router&#xff08;路由器&#xff09;4.3 Internet Protocol4.4 IPv4 addressing4.5 NAT&#xff08;network address translation&#xff0c;网路地址转换&#xff09;4.6 IPv64.7 Generalized For…

计算机网络——期末复习(4)协议或技术汇总、思维导图

思维导图 协议与技术 物理层通信协议&#xff1a;曼彻斯特编码链路层通信协议&#xff1a;CSMA/CD &#xff08;1&#xff09;停止-等待协议&#xff08;属于自动请求重传ARQ协议&#xff09;&#xff1a;确认、否认、重传、超时重传、 &#xff08;2&#xff09;回退N帧协…

uniapp中Nvue白屏问题 ReferenceError: require is not defined

uniapp控制台输出如下 exception function:createInstanceContext, exception:white screen cause create instanceContext failed,check js stack ->Uncaught ReferenceError: require is not defined 或者 exception function:createInstanceContext, exception:white s…

http 请求总结get

关于get请求传递body的问题 错误代码 有400 , 415 等情况 <!doctype html><html lang"zh"><head><title>HTTP Status 400 – 错误的请求</title><style type"text/css">body {font-family:Tahoma,Arial,sans-seri…

【微信小程序】4plus|搜索框-历史搜索 | 我的咖啡店-综合实训

升级版1-清空全部的再次确认 实现功能: 历史搜索记录展示-历史搜索记录展示10条点击跳转-点击历史搜索记录可同步到搜索框并自动搜索全部删除-可一次性全部删除历史搜索记录全部删除-有再次确认操作展示 进行搜索后留下搜索记录 点击垃圾桶图标,显示【清空全部】 点击【清…

Kubernetes 安装 Nginx以及配置自动补全

部署 Nginx &#xff1a; [rootk8s-master ~]# kubectl create deployment nginx --imagenginx:1.14-alpine deployment.apps/nginx created暴露端口&#xff1a; [rootk8s-master ~]# kubectl expose deployment nginx --port80 --typeNodePort service/nginx exposed查看服…

“库存管理软件的用户体验”:界面与交互设计

3.1可行性分析 开发者在进行开发系统之前&#xff0c;都需要进行可行性分析&#xff0c;保证该系统能够被成功开发出来。 3.1.1技术可行性 开发该库存管理软件所采用的技术是vue和MYSQL数据库。计算机专业的学生在学校期间已经比较系统的学习了很多编程方面的知识&#xff0c;同…

基于openEuler22.09部署OpenStack Yoga云平台(一)

OpenStack Yoga部署 安装OpenStack 一、基础准备 基于OpenStack经典的三节点环境进行部署&#xff0c;三个节点分别是控制节点&#xff08;controller&#xff09;、计算节点&#xff08;compute&#xff09;、存储节点&#xff08;storage&#xff09;&#xff0c;其中存储…

AutoDL服务器深度学习使用过程

前期准备 Xshell,Xftp,Pycharm专业版 step 1:实例开机&#xff08;无卡or有卡&#xff09;&#xff0c;Xshell连接 新建xshell会话&#xff1a; 登录指令格式为&#xff1a; ssh -p 38076 rootregion-1.autodl.com 在ssh -p 38076 rootregion-1.autodl.com命令中&#xff0…

【RabbitMQ的死信队列】

死信队列 什么是死信队列死信队列的配置方式死信消息结构 什么是死信队列 消息被消费者确认拒绝。消费者把requeue参数设置为true(false)&#xff0c;并且在消费后&#xff0c;向RabbitMQ返回拒绝。channel.basicReject或者channel.basicNack。消息达到预设的TTL时限还一直没有…

详解从输入url到页面渲染

当你在浏览器中输入一个 URL 并按下回车键&#xff0c;浏览器会经历一系列步骤来加载并渲染页面。这些步骤包括 DNS 解析、缓存处理、建立连接、发送请求、接收响应、解析 HTML、构建 DOM 树和 CSSOM 树、执行 JavaScript、布局和绘制等。以下是这些步骤的详细解释&#xff0c;…

从 GitLab.com 到 JihuLab.com 的迁移指南

本文分享从 GitLab.com 到 JihuLab.com 的迁移指南。 近期&#xff0c;GitLab Inc. 针对其 SaaS 产品做了限制&#xff0c;如果被判定为国内用户&#xff0c;则会建议使用其在国内的发布版本极狐GitLab。从 GitLab SaaS 产品&#xff08;GitLab.com&#xff09;迁移到极狐GitL…

AIA - IMSIC之二(附IMSIC处理流程图)

本文属于《 RISC-V指令集基础系列教程》之一,欢迎查看其它文章。 1 ​​​​​​​通过IMSIC接收外部中断的CSR 软件通过《AIA - 新增的CSR》描述的CSR来访问IMSIC。 machine level 的 CSR 与 IMSIC 的 machine level interrupt file 可相互互动;而 supervisor level 的 CSR…

Python爬虫实战(保姆级登网页信息爬取教程)

此blog为爬虫实战教学&#xff0c;代码已附上&#xff0c;可以复制运行。若要直接看实战代码翻到博客后半部分。 本文使用selenium库进行爬虫&#xff0c;实现爬取数据操作&#xff0c;此库是通过模仿用户的操作进行对页面的处理。了解了这个思维模式&#xff0c;可以对代码进…