Как вы выполняете умножение матрицы шейдеров OpenGL ES 2.0? - PullRequest
0 голосов
/ 04 августа 2010

Я пытаюсь преобразовать вершины с помощью шейдерной программы, но я не могу понять результаты. Я подготовил матрицы проекций, представлений (транс) и моделей (транс):

Сначала у меня есть функция вершинного шейдера: viewproj * position. В программе Objective-C я начинаю с идентичности, умноженной на матрицы перевода и проекции, а затем в форме для viewproj. Я вижу геометрию, реагирующую на глобальный перевод, в перспективе.

Я бы хотел выровнять матрицы по отдельности и работать все в шейдерах. Я формирую proj, view (trans), model (trans) и пытаюсь в шейдере: proj view model position. Но семы не очень хорошо преобразованы (из представления?) Затем я пытаюсь просто смоделировать свое первое преобразование Я унифицирую proj и просматриваю, в шейдере я пытаюсь с (view proj) позицией сделать ту же операцию, но разве не просмотр proj выполнен в C.

Я использую матрицы, описанные в столбцах 0-4, это первый столбец. И со структурой, определенной в http://www.songho.ca/opengl/gl_transform.html#modelview

Теперь я не знаю, чего мне не хватает, хочу, чтобы у меня был простой ответ. Если у кого-то есть подсказка, спасибо.

pd: Могу ли я отладить этот шейдер? (XCode + симулятор iphoneos)

Ответы [ 2 ]

2 голосов
/ 04 августа 2010

Если у кого-то есть подсказка, спасибо.

Умножение матриц в шейдере OpenGL выглядит следующим образом:

    gl_Position = projectionMat*modelViewMat*vec4(inPos, 1.0);

inPos - позиция вершины vec3.

Если вам нужно больше матриц (стиль DirectX), вам придется использовать

    gl_Position = projectionMat*viewMat*worldMat*vec4(inPos, 1.0);

В идеале матрицы должны быть извлечены из OpenGL, и проекция не должна быть преобразованием идентичности. Используйте gluOrtho2D, если вам нужна 2D-графика.

Также вы можете случайно транспонировать или забыть транспонировать матрицы при загрузке их в униформу.

В любом случае, если у вас возникли проблемы с шейдерами, сначала напишите приложение, которое будет рендерить вещи без шейдеров, затем запишите шейдер и загрузите матрицы преобразования из OpenGL, а затем преобразуйте его (если вам это нужно) в пользовательские процедуры вычисления матриц.

В зависимости от версии OpenGL у вас может быть доступна функция GLSL ftransform (), которая еще больше упростит ситуацию.

0 голосов
/ 04 августа 2010

я начинаю с идентичности, умноженной на матрицы перевода и проекции, а затем в форме для viewproj

Это личность-> перевод-> viewproj-> проекция, как вы сказали:

Рго вид модель * положение

Тебе трудно читать. Не могли бы вы опубликовать код, пожалуйста?

...