5

我正在尝试将 OpenTK Matrix4 传递给着色器制服,但 GL.UniformMatrix4 似乎没有合适的重载。重载接受floatorfloat[]ref float。同样,我找不到将 Matrix4 实例转换为浮点数组的方法 - 我已经看到一个在 Matrix4 上使用 ToArray 方法的示例,但我正在使用的分布中似乎没有。

当然,我遗漏了一些简单的东西,因为这对于将模型/视图/投影矩阵传递给着色器非常重要。

我正在使用带有最新版本 MonoTouch 的 OpenTK 版本。

4

2 回答 2

5

这个辅助函数有效,但看起来像个 hack。

基本上它只是传递 Row0,Col0 的地址。由于 C# 不保证结构中字段的顺序,因此理论上它的工作比任何事情都靠运气。

public static void UniformMatrix4(int location, Matrix4 value)
{
    GL.UniformMatrix4(location, 1, false, ref value.Row0.X);
}

当然,OpenTK 应该具有允许直接传递 Matrix4 的绑定。

于 2011-12-04T13:33:44.397 回答
3

根据 iphone 标签,我假设您正在使用OpenTK.Graphics.ES20.GL而不是常规桌面OpenTK.Graphics.OpenGL.GL。OpenGL ES 绑定不如标准桌面绑定那样彻底,后者包含向量和矩阵的重载。

您编写的方法与实际 OpenGL 绑定的方法几乎完全相同,只是将 Matrix4 作为 ref 传递,因为按值传递 Matrix4 很慢。

仅供参考,可以使用StructLayoutAttributewith a LayoutKindof来保证 C# 结构中字段的顺序Sequential,而 OpenTK 数学结构就是这样做的。

于 2011-12-30T13:55:29.803 回答