当前位置: 首页 > news >正文

WebGPU学习(8)---使用RenderBundle

RenderBundle是什么

通常情况下,WebGPU每次绘制时都需要向RenderPassEncoder注册渲染命令。处理此绘图命令比 WebGL 内部执行的类似处理更快。但是,如果可以省略此命令注册过程,则可以能够更快地绘制。RenderBundle 就是实现这一点的。

RenderBundle 允许预先注册的绘图命令稍后重用。 命令可以重复使用,这减少了为每个绘制调用注册命令的成本。

由于注册的绘图命令在内部被转换为GPU可以理解的命令格式, 比绘制时每次都用RenderPassEncoder进行转换效率更高。

程序实现

1. 创建RenderBundle

首先,使用devicecreateRenderBundleEncoder函数创建一个RenderBundleEncoder。 此时用作参数的描述符是一个名为 GPURenderBundleDescriptor 的类型, 注意创建RenderPassEncoder时与GPURenderPassDescriptor不同。

该描述符有一个名为 colorFormats 的属性,用来指定纹理格式。 由于这次我们要渲染到 Canvas,因此我们将使用 navigator.gpu.getPreferredCanvasFormat() 的值。

function buildRenderBundle(pipeline: GPURenderPipeline): void {const presentationFormat = navigator.gpu.getPreferredCanvasFormat();const renderBundleDescriptor: GPURenderBundleDescriptor = {colorFormats:[presentationFormat],};const encoder = g_device.createRenderBundleEncoder(renderBundleDescriptor);encoder.setPipeline(pipeline);encoder.draw(3, 1, 0, 0);g_renderBundle = encoder.finish();
}

创建 RenderBundleEncoder 后,像注册 RenderPassEncoder 一样注册绘图命令。

完成后,调用 finish() (而不是像 RenderPassEncoder 中那样的 end())。 这个 finish() 函数返回一个 RenderBundle 对象。

2. 使用RenderBundle进行绘制

接下来使用 RenderBundle 进行绘制。照常使用 createCommandEncoderbeginRenderPass 函数, 创建一个 RenderPassEncoder。

这个RenderPassEncoder有一个函数叫executeBundles(),RenderBundle以数组的形式传递给这个函数。

  const commandEncoder = g_device.createCommandEncoder();const textureView = context.getCurrentTexture().createView();const renderPassDescriptor: GPURenderPassDescriptor = {colorAttachments: [{view: textureView,clearValue: { r: 0.0, g: 0.0, b: 0.0, a: 1.0 },loadOp: 'clear',storeOp: 'store',},],};const passEncoder = commandEncoder.beginRenderPass(renderPassDescriptor);passEncoder.executeBundles([g_renderBundle]);passEncoder.end();g_device.queue.submit([commandEncoder.finish()]);

结果

在线示例查看。

http://www.lryc.cn/news/152247.html

相关文章:

  • 【前端】常用功能合集
  • chatgpt谈论日本排放污水事件
  • Linux 查看当前目录大小
  • 操作系统备考学习 day1 (1.1.1-1.3.1)
  • HTTP:http上传文件的原理及java处理方法的介绍
  • [实习笔记] 字符串练习 (将大量的字符串用int值编码,然后通过int值二分快速查找某个字符串)
  • EMC VNX2代一键关机方法
  • 提升系统管理:监控和可观察性在DevOps中的作用
  • IIS搭建本地电脑服务器:通过内网穿透技术实现公网访问的步骤指南
  • Linux系统中驱动入门设备树DTS(经典)
  • 关系型数据库与非关系型数据库类比
  • Ubuntu入门03——Ubuntu用户操作
  • 输出图元(四)8-1 图元、屏幕坐标、指定二维世界坐标系统
  • 机器学习---决策树的划分依据(熵、信息增益、信息增益率、基尼值和基尼指数)
  • java解析json
  • PAT 1163 Dijkstra Sequence
  • 嵌入式学习之进程
  • C#-单例模式
  • WSNs 安全技术
  • H5如何做页面下拉刷新和上拉加载
  • Camunda 7.x 系列【42】事件子流程
  • JVM类的加载过程
  • Jmeter如何设置中文版
  • flutter自定义按钮-文本按钮
  • 无涯教程-Android - CheckBox函数
  • [Go版]算法通关村第十五关青铜——用4KB内存寻找重复元素
  • OJ练习第159题——消灭怪物的最大数量
  • Prometheus-Rules(规则)
  • 打卡智能中国(六):村里出了“飞行员”
  • 自动化运维工具Ansible之playbooks剧本