MonoTouch OpenTK и UniformMatrix4 - PullRequest
       23

MonoTouch OpenTK и UniformMatrix4

5 голосов
/ 04 декабря 2011

Я пытаюсь передать OpenTK Matrix4 в форму шейдера, но, похоже, нет подходящей перегрузки для GL.UniformMatrix4.Перегрузки принимают либо float, либо float[], либо ref float.Точно так же я не могу найти способ преобразовать экземпляр Matrix4 в массив с плавающей точкой - я видел один пример, который использует метод ToArray в Matrix4, но, похоже, его нет в используемом мной дистрибутиве.

Конечно, я упускаю что-то простое, так как это очень важно для возможности передать матрицу модели / вида / проекции в шейдер.

Я использую версию OpenTK, поставляемую споследняя версия MonoTouch.

Ответы [ 2 ]

4 голосов
/ 04 декабря 2011

Эта вспомогательная функция работает, но выглядит как хак.

В основном это просто передача адреса Row0, Col0.Поскольку C # не дает никаких гарантий относительно порядка полей в структуре, теоретически он работает на удачу больше, чем что-либо еще.

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

Конечно, OpenTK должен иметь привязки для прямой передачи Matrix4.

3 голосов
/ 30 декабря 2011

Исходя из тега iphone, я предполагаю, что вы используете OpenTK.Graphics.ES20.GL, а не обычный рабочий стол OpenTK.Graphics.OpenGL.GL.Привязки OpenGL ES не так полны, как стандартные привязки рабочего стола, которые содержат перегрузки для векторов и матриц.

Метод, который вы написали, почти такой же, как метод реальных привязок OpenGL, только тот, который проходитMatrix4 как ref, потому что передача Matrix4 по значению медленна.

И только к сведению, можно гарантировать порядок полей в структуре в C #, используя StructLayoutAttribute с LayoutKind Sequentialи математические структуры OpenTK делают именно это.

...