我目前有一个BindGroupandBindGroupLayout看起来像这样:
let bind_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor {
label: None,
entries: &[wgpu::BindGroupLayoutEntry {
binding: 0,
visibility: wgpu::ShaderStages::FRAGMENT,
ty: wgpu::BindingType::Texture {
sample_type: wgpu::TextureSampleType::Float { filterable: true },
view_dimension: wgpu::TextureViewDimension::D2,
multisampled: false,
},
count: None,
}],
});
let bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor {
label: None,
entries: &[wgpu::BindGroupEntry {
binding: 0,
resource: wgpu::BindingResource::TextureView(&target),
}],
layout: &bind_group_layout,
});
Run Code Online (Sandbox Code Playgroud)
并按预期工作。
对于上下文:我在渲染通道中使用它们来进行后处理。
现在我的着色器中还需要一个Sampler。首先我创建了Sampler
let linear_sampler = device.create_sampler(&wgpu::SamplerDescriptor {
mag_filter: wgpu::FilterMode::Nearest,
min_filter: wgpu::FilterMode::Nearest,
mipmap_filter: wgpu::FilterMode::Nearest,
..Default::default()
});
Run Code Online (Sandbox Code Playgroud)
并将其添加到布局和绑定组中,如下所示:
let bind_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { …Run Code Online (Sandbox Code Playgroud) 我一直在研究一种创建剪贴蒙版的 webgpu 方法。
这是我尝试过的:
const pipeline1 = device.createRenderPipeline({
vertex: {
module: basicShaderModule,
entryPoint: 'vertex_main',
buffers: [{
attributes: [{
shaderLocation: 0,
offset: 0,
format: 'float32x2'
}],
arrayStride: 8,
stepMode: 'vertex'
}],
},
fragment: {
module: basicShaderModule,
entryPoint: 'fragment_main',
targets: [{ format }]
},
primitive: {
topology: 'triangle-strip',
},
layout: 'auto',
})
passEncoder.setPipeline(pipeline1);
const uniformValues1 = new Float32Array(4)
uniformValues1.set([1, 0, 0, 1], 0)
const uniformBuffer1 = device.createBuffer({
size: uniformValues1.byteLength,
usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,
});
device.queue.writeBuffer(uniformBuffer1, 0, uniformValues1)
passEncoder.setBindGroup(0, device.createBindGroup({
layout: pipeline1.getBindGroupLayout(0),
entries: …Run Code Online (Sandbox Code Playgroud) 我有一个用 wgpu/rust 编写的物理模拟器,当我从命令行运行时它可以工作。但是,当我尝试在 chrome v114 上运行(根据我在网上看到的支持)时,我收到以下错误,指出计算工作组的最大数量为零。我打印了适配器功能,得到以下信息:Limits { . . . max_compute_workgroup_storage_size: 0, max_compute_invocations_per_workgroup: 0, max_compute_workgroup_size_x: 0, max_compute_workgroup_size_y: 0, max_compute_workgroup_size_z: 0, max_compute_workgroups_per_dimension: 0, max_push_constant_size: 256 }
此外,抛出错误时控制台会转储以下内容:
Version: WebGL 2.0 (OpenGL ES 3.0 Chromium)
我的适配器设置错误吗?或者 wgpu 还不支持浏览器中的计算着色器?欢迎任何建议。感谢大家。
编辑:以防万一这会破解代码,这些是我在本机运行时的设备功能。
...
max_compute_workgroup_storage_size: 16384,
max_compute_invocations_per_workgroup: 256, max_compute_workgroup_size_x: 256, max_compute_workgroup_size_y: 256, max_compute_workgroup_size_z: 64, max_compute_workgroups_per_dimension: 65535, max_push_constant_size: 0 }```
Run Code Online (Sandbox Code Playgroud) 我试图了解 wgpu 和 Dawn 的一般概念。
据我了解,Khronos 的 WebGPU 标准有两种主要实现:Mozilla 的 wgpu 和 Google 的 Dawn。
我的理解是否正确:
-wgpu:它是一个 C/Rust 库,可以编译成操作系统的可执行文件和浏览器的 WebAssembly 代码吗?
-Dawn:只能为浏览器创建Web Assembly代码。
我还想问:wgpu 可以创建 WebAssembly 代码吗?wgpu 是否只转换其 API 代码或 C/C++ 代码?我想不通。