是否可以将 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?的主要内容,如果未能解决你的问题,请参考以下文章