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

Jos*_*gas 4 opengl rust

我正在使用 opengl 学习 Rust。我专门使用 opengl 的“gl”板条箱。我正在使用“glam”板条箱进行 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);
Run Code Online (Sandbox Code Playgroud)

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

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

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

Jos*_*gas 5

感谢 EvilTak 的评论。

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

通过更改解决的问题:

gl::UniformMatrix4fv(transform_loc, 1, gl::FALSE, transform as *const f32);
Run Code Online (Sandbox Code Playgroud)

gl::UniformMatrix4fv(transform_loc, 1, gl::FALSE, &transform.to_cols_array()[0]);
Run Code Online (Sandbox Code Playgroud)