2011-12-04 32 views
5

Estoy tratando de pasar un OpenTK Matrix4 a un sombreador uniforme, pero no parece haber una sobrecarga adecuada para GL.UniformMatrix4. Las sobrecargas aceptan float o float[] o ref float. Del mismo modo, no puedo encontrar una manera de convertir una instancia de Matrix4 en una matriz flotante: he visto una muestra que usa un método ToArray en Matrix4, pero eso no parece estar presente en la distribución que estoy usando.MonoTouch OpenTK y UniformMatrix4

Claro que me falta algo simple, ya que esto es bastante fundamental para poder pasar una matriz de modelo/vista/proyección a un sombreador.

Estoy utilizando la versión de envío de OpenTK con la última versión de MonoTouch.

Respuesta

4

Esta función de ayuda funciona, pero parece un truco.

Básicamente está pasando la dirección de Row0, Col0. Sin embargo, dado que C# no garantiza el orden de los campos en una estructura, teóricamente funciona más por suerte que nada.

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

Seguramente OpenTK debe tener ataduras de permitir pasar un Matrix4 directamente.

+0

No sé mucho sobre estas cosas de interoperabilidad, pero presumiblemente este atributo '[StructLayout (LayoutKind.Sequential)]' en la parte superior de Matrix4 de hecho asegura que se establece de esa manera en la memoria. * Editar: * Oh ... Robert dijo lo mismo. – mpen

+0

ref value.Row0.X funcionó. Me pregunto por qué ref value.M11 no lo hace. De todos modos, ¿esto funciona por suerte o está garantizado? –

3

Basado en la etiqueta iphone, asumo que estás usando OpenTK.Graphics.ES20.GL y no en el escritorio normal OpenTK.Graphics.OpenGL.GL. Los enlaces de OpenGL ES no son tan completos como los enlaces de escritorio estándar, que contienen sobrecargas para vectores y matrices.

El método que escribió es casi exactamente el mismo que el método de los enlaces de OpenGL reales, solo que uno pasa el Matrix4 como ref, porque pasar un Matrix4 por valor es lento.

Y lo digo, es posible garantizar el orden de los campos en una estructura en C# usando StructLayoutAttribute con un LayoutKind de Sequential, y las estructuras matemáticas OpenTK hacer precisamente eso.

+0

en otras palabras, su método de ayuda está bien ya que es exactamente lo mismo que las sobrecargas que usa OpenTK. –