GPUBindGroup
GPUBindGroup 用 device.createBindGroup(descriptor) 创建。它本身没有方法。布局决定每个绑定号是什么资源,绑定组填入具体对象。
interface GPUBindGroupDescriptor { label?: string; layout: GPUBindGroupLayout; entries: GPUBindGroupEntry[];}
interface GPUBindGroupEntry { binding: GPUIndex32; resource: GPUBindingResource;}
type GPUBindingResource = | GPUSampler | GPUTexture | GPUTextureView | GPUBuffer | GPUBufferBinding | GPUExternalTexture;
interface GPUBufferBinding { buffer: GPUBuffer; offset?: GPUSize64; size?: GPUSize64;}直接传 GPUBuffer 等价于 { buffer }。直接传 GPUTexture 等价于它的默认视图。
interface GPUBindGroupLayoutEntry { binding: GPUIndex32; visibility: GPUShaderStageFlags; buffer?: GPUBufferBindingLayout; sampler?: GPUSamplerBindingLayout; texture?: GPUTextureBindingLayout; storageTexture?: GPUStorageTextureBindingLayout; externalTexture?: GPUExternalTextureBindingLayout;}每一项只能填写一种资源成员。visibility 是 GPUShaderStage.VERTEX(0x1)、FRAGMENT(0x2)、COMPUTE(0x4)的组合。
interface GPUBufferBindingLayout { type?: "uniform" | "storage" | "read-only-storage"; // 默认 "uniform" hasDynamicOffset?: boolean; // 默认 false minBindingSize?: GPUSize64; // 默认 0}
interface GPUTextureBindingLayout { sampleType?: "float" | "unfilterable-float" | "depth" | "sint" | "uint"; // 默认 "float" viewDimension?: GPUTextureViewDimension; // 默认 "2d" multisampled?: boolean; // 默认 false}
interface GPUStorageTextureBindingLayout { access?: "write-only" | "read-only" | "read-write"; // 默认 "write-only" format: GPUTextureFormat; viewDimension?: GPUTextureViewDimension; // 默认 "2d"}
interface GPUSamplerBindingLayout { type?: "filtering" | "non-filtering" | "comparison"; // 默认 "filtering"}minBindingSize 为 0 时,管线创建不检查大小,绘制或 dispatch 时再检查缓冲是否盖得住着色器变量。Uniform 的 offset 必须是 minUniformBufferOffsetAlignment 的倍数,默认限制是 256。
createPipelineLayout({ bindGroupLayouts }) 的数组下标就是 @group 编号。GPURenderPipeline 和 GPUComputePipeline 都有 getBindGroupLayout(index);管线使用 layout: "auto" 时,用它取出推断布局。
- 教程:绑定组
- 规范:GPUBindGroup