2011-12-04 35 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使用的重載完全相同。 –