如何在glium中使用cgmath :: Matrix作为统一参数?

时间:2016-10-13 17:49:44

标签: rust glium

我正在尝试将cgmath库集成到glium的第一个实验中,但我无法弄清楚如何将Matrix4对象传递给draw()打电话。

我的uniforms对象因此被定义:

let uniforms = uniform! {
    matrix: cgmath::Matrix4::from_scale(0.1)
};

这是我的draw电话:

target.draw(&vertex_buffer, &index_slice, &program, &uniforms, &Default::default())
      .unwrap();

无法使用消息编译

error[E0277]: the trait bound `cgmath::Matrix4<{float}>: glium::uniforms::AsUniformValue` is not satisfied

我是Rust的初学者,但我确实认为自己无法实现这一特性,因为它和Matrix4类型都与我的分开。

除了手动将矩阵转换为浮点数组数组之外,真的没有更好的选择吗?

1 个答案:

答案 0 :(得分:7)

  

我相信我自己无法实现这个特性,因为它和Matrix4类型都与我的分开。

这是真的。

  

除了手动将矩阵转换为浮点数组数组之外,真的没有更好的选择吗?

嗯,你不必手动做很多事情。

首先,请注意Matrix4<S> implements Into<[[S; 4]; 4]>(我无法直接链接到该impl,因此您必须使用 ctrl + ˚F)。这意味着您可以轻松地将Matrix4转换为glium接受的数组。遗憾的是,into()仅在编译器确切知道要转换为何种类型时才有效。所以这是一个非工作和工作版本:

// Not working, the macro accepts many types, so the compiler can't be sure 
let uniforms = uniform! {
    matrix: cgmath::Matrix4::from_scale(0.1).into()
};

// Works, because we excplicitly mention the type
let matrix: [[f64; 4]; 4] = cgmath::Matrix::from_scale(0.1).into();
let uniforms = uniform! {
    matrix: matrix,  
};

但这个解决方案可能仍然无法编写。当我使用cgmathglium时,我创建了一个辅助特征来进一步减少代码大小。这可能不是最好的解决方案,但它有效并且没有明显的缺点(AFAIK)。

pub trait ToArr {
    type Output;
    fn to_arr(&self) -> Self::Output;
}

impl<T: BaseNum> ToArr for Matrix4<T> {
    type Output = [[T; 4]; 4];
    fn to_arr(&self) -> Self::Output {
        (*self).into()
    }
}

我希望这段代码能够解释自己。有了这个特性,您现在只需use电话附近的draw()特征,然后:

let uniforms = uniform! {
    matrix: cgmath::Matrix4::from_scale(0.1).to_arr(),
    //                                      ^^^^^^^^^
};