2011-12-04 6 views
5

OpenTK Matrix4をシェーダユニフォームに渡そうとしていますが、GL.UniformMatrix4に適切なオーバーロードがないようです。過負荷はfloatまたはfloat[]または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

このinteropのことはあまりよく分かりませんが、Matrix4の上部にあるこの属性[StructLayout(LayoutKind.Sequential)]は実際にメモリにそのように配置されていることを確かめています。 *編集:*ああ...ロバートは同じことを言った。 – mpen

+0

ref値.Row0.Xが機能しました。私はなぜref値M11がないのだろうか。とにかく、これは幸運か保証されていますか? –

3

iphoneタグに基づいて、OpenTK.Graphics.ES20.GLを使用していて、通常のデスクトップではないと仮定していますOpenTK.Graphics.OpenGL.GL。 OpenGL ESバインディングは、ベクトルや行列のオーバーロードを含む標準のデスクトップバインディングほど徹底的ではありません。

あなたが書いたメソッドは実際のOpenGLバインディングのメソッドとほとんど同じですが、値でMatrix4を渡すのが遅いため、refとしてMatrix4を渡します。

そして、ちょうどFYI、SequentialLayoutKindStructLayoutAttributeを使用してC#で構造体のフィールドの順序を保証することが可能である、とOpenTK数学の構造体はちょうどそれを行います。

+0

つまり、あなたのヘルパーメソッドは、OpenTKが使用するオーバーロードとまったく同じである点で問題ありません。 –