2011-12-04 37 views
5

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

当然,我错过了一些简单的东西,因为这是能够将模型/视图/投影矩阵传递给着色器的基础。

我使用OpenTK版本的最新版本的MonoTouch。

回答

4

这个辅助函数可以工作,但看起来像一个黑客。

基本上它只是传递Row0,Col0的地址。由于C#对结构中的字段顺序没有任何保证,理论上它比运气更有效。

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

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

+0

我对这个互操作性的东西了解不多,但是大概这个属性'[StructLayout(LayoutKind.Sequential)]'在Matrix4的顶部确实确保了它在内存中的布局。 *编辑:*哦...罗伯特说同样的事情。 – mpen

+0

ref value.Row0.X工作。我想知道为什么ref.M11没有。无论如何,这是运气还是保证? –

3

基于iphone标签,我假设您使用的是OpenTK.Graphics.ES20.GL而不是普通桌面OpenTK.Graphics.OpenGL.GL。 OpenGL ES绑定不像标准桌面绑定那样彻底,其中包含向量和矩阵的重载。

您写的方法几乎与实际的OpenGL绑定方法完全相同,只是通过Matrix4作为参考,因为按值传递Matrix4速度很慢。

而只是供参考,也可以使用StructLayoutAttributeSequential一个LayoutKind保证字段的顺序在一个struct在C#和OpenTK数学结构做到这一点。

+0

换句话说,你的帮助器方法很好,因为它与OpenTK使用的重载完全相同。 –