WGPU:如何更改 max_bind_groups/设备绑定组限制?

问题描述 投票:0回答:1

我正在尝试在 wgpu 中创建多个绑定组(每个纹理对应一个我必须加载的纹理),但我的设备似乎只能支持 4 个绑定组:每当我尝试使用更多绑定组时,都会收到错误“绑定组布局计数” 5 超出设备绑定组限制 4"。

从 wgpu 文档中,我不清楚这是否是硬件设备的实际限制,或者是否是软限制并且可以在软件中设置。在https://docs.piston.rs/conrod/wgpu/struct.Limits.html中,它提到 max_bind_groups 的默认值为 4,这与我得到的错误中的最大值相同。

我认为许多应用程序使用超过 4 个纹理,并且它们都可以在我的设备上运行(即使可能不使用 wgpu?),所以是否可以更改此限制并消除错误?

谢谢!

rust textures wgpu-rs
1个回答
0
投票

从 wgpu 文档中,我不清楚这是否是硬件设备的实际限制,或者是否是软限制并且可以在软件中设置。

wgpu
的设计是为了(当一切正常工作时)当您在新硬件上运行程序时不会出现令人惊讶的错误。因此,无论硬件支持什么,您传递给
Limits
request_device()
始终会被强制执行。但如果您指定的限制高于硬件支持,
request_device()
将会失败。

因此,一般来说,您应该指定

Limits
,其数量与您的应用程序所需的数量完全相同。如果您的应用程序可以灵活,请咨询
Adapter::limits()
了解支持的内容,然后根据您的请求适当调整该限制。

我认为许多应用程序使用超过 4 个纹理,并且它们都可以在我的设备上运行(即使可能不使用 wgpu?)

有很多方法可以使

max_bind_groups
限制不是纹理的限制:

  • 不同的绘制调用可以使用通过
    set_bind_group()
    设置的不同绑定组 — 
    max_bind_groups
    是管道同时使用多少个绑定组的限制,而不是您可以创建多少个绑定组。 每个绑定组可以有多个绑定。
  • 绑定组中的每个绑定都可以是纹理数组(如果支持
  • Features::TEXTURE_BINDING_ARRAY
  • )。
    纹理可以用作
  • 数组纹理
  • D2Array
    ),它存储大小相同但内容不同的“层”。
    纹理可以用作
  • 纹理图集
  • ——这不是图形 API 功能,而只是将纹理的不同部分用于不同目的的想法。
  • 在拥有网格和纹理资源的简单情况下,通常每个网格都有一个关联的
material

(这是您在代码中创建的抽象,而不是图形 API 中的某些内容)——它使用的一个或多个纹理,也可能是其他控制绘图的参数。您为每种材质创建一个绑定组,然后在渲染时,为一种材质绘制 set_bind_group(),绘制使用该材质的所有对象,然后再次

set_bind_group()
,依此类推。无论材质是什么,这仅使用管道中的
one
绑定组槽。您至少需要为相机使用另一个绑定组 - 这只是默认情况下可用的 4 个插槽中的 2 个。 当然,其他类型的渲染实际上可能需要同时访问许多纹理。这时您就可以使用上面列表中的其他技术。

© www.soinside.com 2019 - 2024. All rights reserved.