如何在 glium 中使用 cgmath::Matrix 作为统一参数?
How can I use a cgmath::Matrix as a uniform parameter in 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
类型都在一个独立于我的板条箱中。
真的没有比手动将矩阵转换为浮点数组更好的选择了吗?
I do believe I cannot implement this trait myself, as both it and the Matrix4
type are in a crate separate from mine.
这很对。
Is there really no better option than to manually convert the matrix into an array of arrays of floats?
好吧,您不必手动做很多事情。
首先,注意 Matrix4<S>
implements Into<[[S; 4]; 4]>
(我不能 link 直接到那个 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,
};
但是这个解决方案可能还是太难写了。当我使用 cgmath
和 glium
时,我创建了一个辅助特征来进一步减少代码大小。这可能不是最好的解决方案,但它有效并且没有明显的缺点(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(),
// ^^^^^^^^^
};
我正在尝试将 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
类型都在一个独立于我的板条箱中。
真的没有比手动将矩阵转换为浮点数组更好的选择了吗?
I do believe I cannot implement this trait myself, as both it and the
Matrix4
type are in a crate separate from mine.
这很对。
Is there really no better option than to manually convert the matrix into an array of arrays of floats?
好吧,您不必手动做很多事情。
首先,注意 Matrix4<S>
implements Into<[[S; 4]; 4]>
(我不能 link 直接到那个 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,
};
但是这个解决方案可能还是太难写了。当我使用 cgmath
和 glium
时,我创建了一个辅助特征来进一步减少代码大小。这可能不是最好的解决方案,但它有效并且没有明显的缺点(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(),
// ^^^^^^^^^
};