是否可以将 Mat4 作为 rust 'glam' crate 中的浮点指针传递给 Opengl 调用 gl::UniformMatrix4fv?

Posted

技术标签:

【中文标题】是否可以将 Mat4 作为 rust \'glam\' crate 中的浮点指针传递给 Opengl 调用 gl::UniformMatrix4fv?【英文标题】:Is it possible to pass a Mat4 as float pointer in rust 'glam' crate to Opengl call gl::UniformMatrix4fv?是否可以将 Mat4 作为 rust 'glam' crate 中的浮点指针传递给 Opengl 调用 gl::UniformMatrix4fv? 【发布时间】:2021-06-07 12:40:26 【问题描述】:

我正在使用 opengl 学习 rust。我专门为 opengl 使用“gl”板条箱。我正在使用 'glam' crate 进行 3d 数学运算。函数 gl::UniformMatrix4fv() 查找的最后一个参数是 *const GLfloat 类型。我试过了:

    let mut transform = Mat4::IDENTITY;
    transform = transform * Mat4::from_translation(Vec3::new(0.5, 0.5, 0.0));
    transform = transform * Mat4::from_axis_angle(Vec3::new(0.0, 0.0, 1.0), window.get_time());

    let transform_loc = gl::GetUniformLocation(shader.id, CString::new("transform").unwrap().as_ptr());
    gl::UniformMatrix4fv(transform_loc, 1, gl::FALSE, transform as *const f32);

但是 glam 将 Mat4 实现为结构。上面的代码出现“non-primitive cast: glam::Mat4 as *const f32”错误。

如果没有强制转换,错误是“类型不匹配。预期 *-ptr,找到 'glam::Mat4' 预期原始指针 *const f32 找到 struct glam::Mat4”

查看文档,我没有看到任何将返回指向矩阵数据的指针的函数。任何帮助或转向正确的方向将不胜感激。如果不可能,我会尝试不同的箱子。

【问题讨论】:

您可能必须将Mat4::to_cols_array 返回的数组存储在局部变量中,并传入指向该数组的指针。 感谢这工作!我将 transform 参数更改为 &transform.to_cols_array()[0] 。您想发布一个正式的答案,以便我给您信用吗? 别担心!不需要,请继续并接受您自己的答案。 【参考方案1】:

归功于 EvilTak 的评论。

glam 有一个方法 to_col_array() 可以返回 Mat4 中的数据。

通过更改解决的问题:

gl::UniformMatrix4fv(transform_loc, 1, gl::FALSE, transform as *const f32);

gl::UniformMatrix4fv(transform_loc, 1, gl::FALSE, &transform.to_cols_array()[0]);

【讨论】:

以上是关于是否可以将 Mat4 作为 rust 'glam' crate 中的浮点指针传递给 Opengl 调用 gl::UniformMatrix4fv?的主要内容,如果未能解决你的问题,请参考以下文章

如何将mat4数组作为制服传递

在相机后面的位置进行广告牌时的伪影

WebGL矩阵(mat4)表示法是否对应于数学矩阵表示法

如何将 Rust 函数作为参数传递?

访问原始 Rust 类型的方法

Rust 和 Cyber​​DWARF 可以一起使用吗?