我正在尝试将OpenTK Matrix4传递给着色器制服,但GL.UniformMatrix4似乎没有合适的重载。重载接受float
或float[]
或ref float
。类似地,我找不到将Matrix4实例转换为float数组的方法 - 我看过一个在Matrix4上使用ToArray方法的示例,但这似乎不存在于我正在使用的发行版中。
当然,我遗漏了一些简单的东西,因为这对于将模型/视图/投影矩阵传递给着色器非常重要。
我正在使用最新版MonoTouch的OpenTK版本。
答案 0 :(得分:4)
这个辅助函数有效,但看起来像是一个黑客。
基本上它只是传递Row0,Col0的地址。由于C#不保证结构中字段的顺序,理论上它比运气更有效。
public static void UniformMatrix4(int location, Matrix4 value)
{
GL.UniformMatrix4(location, 1, false, ref value.Row0.X);
}
当然,OpenTK应该具有允许直接传递Matrix4的绑定。
答案 1 :(得分:3)
根据iphone标记,我假设您使用的是OpenTK.Graphics.ES20.GL
,而不是常规桌面OpenTK.Graphics.OpenGL.GL
。 OpenGL ES绑定不像标准桌面绑定那样彻底,它包含向量和矩阵的重载。
您编写的方法与实际OpenGL绑定的方法几乎完全相同,只是将Matrix4作为ref传递,因为按值传递Matrix4的速度很慢。
只是仅供参考,可以使用StructLayoutAttribute
LayoutKind
Sequential
来保证C#中结构中字段的顺序,而OpenTK数学结构就是这样。