2010-08-04 4 views
0

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

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

Я хотел бы иметь равномерные матрицы отдельно и управлять всем в шейдере. Я унифицирую proj, view (trans), model (trans) и попробуйте в шейдере: proj модель позиция. Но sems не хорошо преобразован (из представления?) Тогда я пытаюсь просто имитировать свое первое преобразование. Я равномерная проектируемый, и вид, в шейдер я стараюсь с (вид проектируемые) положения для того, чтобы сделать ту же операцию, но is'nt вида проектируемыми сделаны в С.

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

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

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

ответ

2

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

Умножение матриц в 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 у вас может быть функция ftransform() GLSL, которая упростит ситуацию еще больше.

0

я начать с идентичностью multiplicated переводом и проекционных матриц, а затем в униформе с viewproj

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

проектируемый вид модель * положение

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

Смежные вопросы