5

OpenTK Matrix4をシェーダーユニフォームに渡そうとしていますが、GL.UniformMatrix4に適したオーバーロードがないようです。オーバーロードは、またはのいずれかfloatを受け入れます。同様に、Matrix4インスタンスをfloat配列に変換する方法を見つけることができません-Matrix4でToArrayメソッドを使用するサンプルを1つ見ましたが、それは私が使用しているディストリビューションには存在しないようです。float[]ref float

モデル/ビュー/プロジェクションマトリックスをシェーダーに渡すことができるようにするための非常に基本的なものであるため、単純なものが欠けていることは確かです。

最新バージョンのMonoTouchで出荷されているバージョンのOpenTKを使用しています。

4

2 に答える 2

5

このヘルパー関数は機能しますが、ハックのようです。

基本的には、Row0,Col0 のアドレスを渡すだけです。ただし、C# は構造内のフィールドの順序について保証しないため、理論的には、何よりも運によって機能します。

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

確かに、OpenTK には、Matrix4 を直接渡すことを許可するバインディングが必要です。

于 2011-12-04T13:33:44.397 に答える
3

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

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

参考までに、 ofを使用StructLayoutAttributeしてC# の構造体のフィールドの順序を保証することは可能であり、OpenTK 数学構造体はまさにそれを行います。LayoutKindSequential

于 2011-12-30T13:55:29.803 に答える