MonoTouch OpenTK and UniformMatrix4

∥☆過路亽.° 提交于 2020-01-02 04:20:08

问题


I'm trying to pass an OpenTK Matrix4 to a shader uniform, but there doesn't seem to be a suitable overload for GL.UniformMatrix4. The overloads accept either float or float[] or ref float. Similarly I can't find a way to convert a Matrix4 instance to a float array - I've seen one sample that uses a ToArray method on the Matrix4, but that doesn't seem to be present in the distribution I'm using.

Sure I'm missing something simple as this is pretty fundamental to being able to pass a model/view/projection matrix to a shader.

I'm using the version of OpenTK shipping with the lastest version of MonoTouch.


回答1:


This helper function works, but seems like a hack.

Basically it's just passing the address of Row0,Col0. Since C# makes no guarantees about the order of fields in a structure though, theoretically it's working by luck more than anything.

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

Surely OpenTK should have bindings to allowing passing a Matrix4 directly.




回答2:


Based on the iphone tag, I'm assuming you're using OpenTK.Graphics.ES20.GL and not the regular desktop OpenTK.Graphics.OpenGL.GL. The OpenGL ES bindings are not as thorough as the standard desktop bindings, which contain overloads for vectors and matrices.

The method you wrote is almost exactly the same as the method the actual OpenGL bindings, only that one passes the Matrix4 as ref, because passing a Matrix4 by value is slow.

And just FYI, it is possible to guarantee the order of fields in a struct in C# using StructLayoutAttribute with a LayoutKind of Sequential, and the OpenTK math structs do just that.



来源:https://stackoverflow.com/questions/8375076/monotouch-opentk-and-uniformmatrix4

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!