2011-12-04 11 views
5

Tôi đang cố gắng chuyển một ma trận OpenTK Matrix4 đến đồng phục đổ bóng, nhưng dường như không có quá tải thích hợp cho GL.UniformMatrix4. Quá tải chấp nhận hoặc float hoặc float[] hoặc ref float. Tương tự như vậy tôi không thể tìm thấy một cách để chuyển đổi một thể hiện Matrix4 thành một mảng float - Tôi đã nhìn thấy một mẫu sử dụng phương thức ToArray trên Matrix4, nhưng điều đó dường như không có mặt trong bản phân phối mà tôi đang sử dụng.MonoTouch OpenTK và UniformMatrix4

Chắc chắn tôi đang thiếu một cái gì đó đơn giản vì điều này là khá cơ bản để có thể chuyển ma trận mô hình/xem/chiếu tới trình đổ bóng.

Tôi đang sử dụng phiên bản giao hàng OpenTK với phiên bản MonoTouch mới nhất.

Trả lời

4

Chức năng trợ giúp này hoạt động, nhưng có vẻ như là một hack.

Về cơ bản, nó chỉ chuyển địa chỉ của Row0, Col0. Vì C# không đảm bảo về trật tự của các trường trong một cấu trúc, mặc dù về mặt lý thuyết nó hoạt động bằng may mắn hơn bất cứ thứ gì.

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

Chắc chắn OpenTK phải có các ràng buộc để cho phép truyền trực tiếp Matrix4.

+0

Tôi không biết nhiều về công cụ này, nhưng có lẽ thuộc tính này '[StructLayout (LayoutKind.Sequential)]' ở đầu Matrix4 thực sự đảm bảo nó được trình bày theo cách đó trong bộ nhớ. * Chỉnh sửa: * Oh ... Robert cũng nói như vậy. – mpen

+0

giá trị ref.Row0.X đã hoạt động. Tôi tự hỏi tại sao giá trị ref.M11 không. Dù sao, điều này làm việc bằng vận may hay được đảm bảo? –

3

Dựa trên thẻ iphone, tôi giả sử bạn đang sử dụng OpenTK.Graphics.ES20.GL chứ không phải máy tính để bàn thông thường OpenTK.Graphics.OpenGL.GL. Các ràng buộc OpenGL ES không triệt để như các ràng buộc máy tính để bàn tiêu chuẩn, có chứa quá tải cho vectơ và ma trận.

Phương pháp bạn viết gần như giống hệt như phương pháp liên kết OpenGL thực tế, chỉ có một chuyển Matrix4 là ref, bởi vì truyền Matrix4 theo giá trị chậm.

Và chỉ FYI, có thể đảm bảo thứ tự các trường trong cấu trúc trong C# bằng cách sử dụng StructLayoutAttribute với LayoutKind của Sequential và cấu trúc toán OpenTK thực hiện điều đó.

+0

nói cách khác, phương pháp trợ giúp của bạn chỉ là tốt trong đó nó chính xác giống như quá tải OpenTK sử dụng. –