我把这个项目作为学习生锈和图形编程的一种方法。该程序基于这个伟大的教程,目前作为本机桌面应用程序工作(至少在Windows上)。
然而,我的主要目标是创建一个web应用程序来展示我的项目。我很难做到这一点,因为我遇到了一个错误,我不知道如何修复(浏览器控制台上的GL_INVALID_OPERATION: It is undefined behaviour to use a uniform buffer that is too small.)。从外观上看,它可能是底层库wgpu的一个bug,但是,由于我没有图形编程经验,所以我无法确定这不是我自己的愚蠢错误。
这一错误清楚地说明了问题与统一缓冲区有关。但是,这个缓冲区有正确的填充,当程序不针对web (普通cargo build --release)时,它看起来是正确实现的。
我在wgpu图书馆的GitHub上打开了一个类似的GitHub,我收到了一些有用的回复,但没能解决我的问题。我找到了一些相关问题,但它对我没有多大用处。
我在.wgsl文件中的统一缓冲区:
struct Uniform {
domain: mat2x2<f32>,
mouse: vec2<f32>,
c: vec2<f32>,
time: f32,
mandelbrot: i32,
padding: vec2<f32>,
}
@group(0) @binding(0)
var<uniform> my_uniform: Uniform;生锈的均匀缓冲器:
#[repr(C)]
#[derive(Copy, Clone, Debug, bytemuck::Zeroable, bytemuck::Pod)]
pub struct Uniform {
pub domain: [[f32; 2]; 2],
pub mouse: [f32; 2],
pub c: [f32; 2],
pub time: f32,
pub mandelbrot: i32,
pub _padding: [f32; 2],
}有关更多详细信息,请查看存储库,所提供的链接是固定到当前提交的,在此链接可以复制。
谢谢。
发布于 2022-09-15 18:22:48
https://github.com/gfx-rs/wgpu/discussions/3027#discussioncomment-3656241解决了这一问题。它似乎是wgpu上的一个bug。
使用vec4<f32>而不是mat2x2<f32>解决了问题。它可能会在未来得到纠正,因为我的实现也应该是有效的。
https://stackoverflow.com/questions/73735162
复制相似问题