Version: 6000.3
语言: 中文
WebGPU 图形 API 简介
针对 WebGL2 和 WebGPU API 的建议

WebGPU 图形 API 的局限性

WebGPU 图形 API 提供了有用的图形功能。但它也有一些您需要注意的限制:

有关更多最佳实践建议,请参阅 WebGL2 和 WebGPU API 的建议

有限的浏览器支持

WebGPU 目前处于实验阶段,并非所有浏览器和设备都支持。有关更多信息,请参阅 MDN Web 文档中关于访问设备浏览器兼容性的文档。

计算着色器限制

计算有一些限制着色器在 GPU 上运行的程序。更多信息
请参阅术语表
在 Web 中。

不支持 RWBuffer

您可以使用结构化缓冲区,RWStructuredBuffer,但不是RWBuffer在计算着色器中。 有限的读写存储纹理格式 WebGPU 仅支持一组有限的纹理格式一种文件格式,用于在 3D 图形硬件(如显卡或移动设备)实时渲染期间处理纹理。更多信息
请参阅术语表
用于计算着色器中的读写存储纹理。HLSL 不会显式说明存储纹理的访问类型,因此它基于使用情况。

RWTexture2D<float> tex; // storage texture
tex[uv] = 1.0f; // write only
tex[uv] += 1.0f; // read-write

只写存储纹理通常得到更好的支持。请参阅纹理格式限制

严格的均匀性分析

使用 WebGPU,您只能从非统一块调用屏障函数。否则,WebGPU 将无法编译着色器。非统一块是着色器代码块,在多个执行线程中不一致。

以下是 HLSL 屏障函数:

  • GroupMemoryBarrier
  • GroupMemoryBarrirWithGroupSync
  • DeviceMemoryBarrier
  • DeviceMemoryBarrierWithGroupSync
  • AllMemoryBarrier
  • AllMemoryBarrierWithGroupSync

异步计算

WebGPU 不支持异步计算。

没有 HLSL 扩展功能

WebGPU 不支持以下功能:

  • 波浪内部函数(WaveBasic、WaveVote、WaveBallot、WaveMath、WaveMultiPrefix)

  • 四重洗牌

  • 整数64

  • 原生16位

GPU 回读

WebGPU 不支持将缓冲区或纹理数据从 GPU 同步回读到 CPU。以下函数将不起作用:

相反,请使用AsyncGPUReadbackAPI 将缓冲区或纹理数据从 GPU 读取到 CPU。对于屏幕截图,请使用ScreenCapture.CaptureScreenshotIntoRenderTexture以及AsyncGPUReadback.

纹理格式限制

有关 WebGPU 纹理格式功能的信息,请参阅有关 WebGPU 的 W3 文档。某些格式比其他 API 上的限制性更强,尤其是在存储纹理使用方面。

例如,WebGPU 不支持RGBA8RHalf作为读写存储纹理格式。如果您确实使用该格式创建了 RenderTexture,则必须将enableRandomWritefalse,这是默认值。

但是,WebGPU 支持RFloat作为存储纹理格式,因此,如果使用RFloat格式enableRandomWrite不需要false.

可以使用 SystemInfo.GetCompatibleFormat 查找适用于给定用法的格式。

渲染纹理通道

片段着色器的输出类型必须具有更大或等于数量的通道作为目标渲染纹理(render texture一种特殊类型的纹理,在运行时创建和更新。要使用它们,请先创建一个新的渲染纹理,并指定要渲染到其中的摄像机之一。然后,你可以在材质中使用渲染纹理,就像使用常规纹理一样。更多信息
请参阅术语表
格式。

如果渲染纹理是RGBA,则它有4个通道。片段着色器必须输出float4half4.如果它返回一个浮点或一半,WebGPU 将遇到错误,因为渲染纹理的通道将被取消初始化。

如果渲染纹理是 R8,则它有 1 个通道。然后,片段着色器可以输出浮点或半浮点。片段着色器还可以返回 float4 或 half4,额外的输出通道将被忽略。

地形纹理限制

在许多平台上,你可以从着色器访问的纹理数量限制为 16 个。此限制可以由地形场景中的地形。地形游戏对象会向场景添加一个大型平面,您可以使用地形的检查器窗口创建详细的景观。更多信息
请参阅术语表
渲染器,尤其是图层纹理。这可能会使 WebGPU 的地形渲染出现问题。建议限制使用的地形纹理图层的数量。

其他资源

WebGPU 图形 API 简介
针对 WebGL2 和 WebGPU API 的建议