首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >wgpu-rs:将Matrix3放入顶点着色器会导致奇怪的行为,但使用Matrix4效果很好。

wgpu-rs:将Matrix3放入顶点着色器会导致奇怪的行为,但使用Matrix4效果很好。
EN

Stack Overflow用户
提问于 2020-05-13 07:23:44
回答 1查看 435关注 0票数 4

使用wgpu-rs,我正在尝试将一个3x3的cg计量矩阵转换成一个着色器(使用编译)。但是,在着色器中生成的mat3有错误的数据。当我将mat3和Matrix3替换为mat4和Matrix4时,一切正常,矩阵具有正确的数据。

顶点着色器:

代码语言:javascript
复制
layout(set=0, binding=0) uniform Uniforms {
    mat3 camera_transform;
};

渲染循环:

代码语言:javascript
复制
let mut encoder = self.device.create_command_encoder(
    &wgpu::CommandEncoderDescriptor {
        label: Some("update encoder"),
    },
);
let staging_buffer = self.device.create_buffer_with_data(
    bytemuck::cast_slice(&[self.uniforms]),
    wgpu::BufferUsage::COPY_SRC,
);
encoder.copy_buffer_to_buffer(&staging_buffer, 0, &self.uniform_buffer, 0, std::mem::size_of::<Uniforms>() as wgpu::BufferAddress);
self.queue.submit(&[encoder.finish()]);

// ...

render_pass.set_bind_group(0, &self.uniform_bind_group, &[]);

制服:

代码语言:javascript
复制
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct Uniforms {
    pub camera_transform: Matrix3::<f32>,
}

unsafe impl bytemuck::Pod for Uniforms {}
unsafe impl bytemuck::Zeroable for Uniforms {}

impl Uniforms {
    pub fn new() -> Self {
        Self {
            camera_transform: Matrix3::identity(),
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-13 16:24:34

这是一个公开发行 in wgpu-rs。实际上,最简单的解决方法可能是将mat3变成一个mat4,直到它被解析为止。

问题似乎是在生成SPIR-V时出现了对齐错误。实际调整是:

  1. 如果该成员是消耗N个基本机器单元的标量,则基对齐为N。
  2. 如果该成员是两个或四个分量向量,且组件消耗N个基本机器单元,则基对齐分别为2N或4N。
  3. 如果该成员是一个三分量向量,其部件消耗N个基本机器单元,则基对齐为4N。
  4. 如果成员是标量或向量数组,则根据规则(1)、(2)和(3)将基对齐和阵列步长设置为匹配单个数组元素的基对齐,并将其舍入到vec4的基对齐。数组的末尾可能有填充;成员在数组后面的基本偏移量被舍入到基对齐的下一个倍数。

在第4种情况下,拥有一个mat4应该不会在最后留下额外的填充,也不会给出任何可能出现的错误对齐问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61768628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档