MonoTouch OpenTK和UniformMatrix4

5
我试图将一个OpenTK Matrix4传递给着色器的均匀变量,但GL.UniformMatrix4没有合适的重载。这些重载接受floatfloat[]ref float。同样,我找不到将Matrix4实例转换为float数组的方法 - 我看到一个示例在Matrix4上使用ToArray方法,但我使用的发行版中似乎没有该方法。
当然,我可能错过了一些简单的东西,因为将模型/视图/投影矩阵传递给着色器非常基本。
我正在使用随最新版本的MonoTouch一起发布的OpenTK版本。
2个回答

5

这个辅助函数虽然可行,但似乎有些取巧。

基本上它只是传递了Row0和Col0的地址。但是由于C#在结构体中字段的顺序没有任何保证,理论上它的工作更多地是运气而非真正的保证。

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

当然,OpenTK应该有绑定来直接传递Matrix4。

我对这个interop相关的东西不是很了解,但是可能Matrix4顶部的这个属性[StructLayout(LayoutKind.Sequential)]确实确保它在内存中以这种方式布局。 编辑:哦...罗伯特也说了同样的话。 - mpen
ref value.Row0.X 可以工作。我不知道为什么 ref value.M11 不行。无论如何,这是靠运气还是有保证的? - Syaiful Nizam Yahya

3
基于 iPhone 标签,我猜测你使用的是 OpenTK.Graphics.ES20.GL 而不是常规桌面版的 OpenTK.Graphics.OpenGL.GL。OpenGL ES 绑定不如标准桌面版绑定全面,后者包含向量和矩阵的重载。
你编写的方法与实际的 OpenGL 绑定方法几乎完全相同,只是一个将 Matrix4 作为 ref 传递,因为按值传递 Matrix4 很慢。
另外,只要使用 C# 的 StructLayoutAttribute 并将 LayoutKind 设置为 Sequential,就可以保证结构体字段的顺序。OpenTK 数学结构体就是这样做的。

换句话说,你的辅助方法非常好,因为它与 OpenTK 使用的重载完全相同。 - Robert Rouhani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接