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()]);

结果

在线示例查看。

Cesium是一个用于构建Web上的3D地球和地理应用程序的JavaScript库。WebGPU是一种新的Web标准API,可用于在Web上实现高性能图形渲染。使用WebGPU可以提供更高的性能,并充分利用现代GPU的并行计算能力。下面是一些优化Cesium应用程序的方法: 1. 使用WebGPU渲染引擎:Cesium 1.84版本开始支持WebGPU渲染引擎。使用WebGPU渲染引擎可以提高性能,并充分利用现代GPU的并行计算能力。 2. 使用Instancing和Batching:Instancing和Batching是两种优化技术,可以减少渲染调用次数,提高性能。Instancing可以通过使用相同的网格和不同的变换矩阵来渲染大量的实例。Batching可以将多个网格合并成一个大网格,从而减少渲染调用次数。 3. 减少渲染距离:Cesium使用Level of Detail(LOD)技术来减少模型渲染的细节级别。这可以通过调整摄像机的高度和距离来实现。减少渲染距离可以减少需要渲染的图形数量,从而提高性能。 4. 使用GPU缓存:Cesium使用GPU缓存来缓存渲染数据,例如纹理和几何数据。这可以减少CPU和GPU之间的数据传输,并提高性能。 5. 优化光照:光照是3D渲染中的重要因素。在Cesium中,可以通过调整光照参数来优化光照。例如,可以使用Ambient Lighting(环境光照)来减少阴影的数量,从而提高性能。 总之,使用WebGPU可以为Cesium应用程序提供更高的性能。除此之外,还可以使用Instancing和Batching、减少渲染距离、使用GPU缓存和优化光照等技术来进一步提高性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

搞GIS图形的sky.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值