Реализовать фиксированную функцию Эффективность конвейера в OpenGL ES 2.0? - PullRequest
1 голос
/ 02 февраля 2011

Я хочу использовать методы фиксированной функции, такие как glTranslate (), glRotate (), glScale () в моем приложении openGL 2.0. Я знаю, что мне нужно реализовать матричный класс - и сделал это. Мой вопрос сейчас об эффективности. Чтобы иметь возможность использовать что-то вроде:

glLoadIdentity();
glRotatef(2.0f, 0.0f, 0.0f, 1.0f);
glScalef(2.0f, 2.0f, 2.0f);

Я думаю, мне нужно сделать как минимум 3 умножения матриц (при условии, что у нас есть проекция, и представление модели соответствует, и это для просмотра модели). Первым будет: Identity-Matrix * Rotation-Matrix - Вторым будет: ActualMatrix * ScaleMatrix, а последним будет: projectionMatrix * ActualMatrix (и этот Im передается как единое значение моему шейдеру).

glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEW_PROJECTION_MATRIX], 1, GL_FALSE, matrix->getProjectionModelviewMatrix());

Итак, мой Вершинный шейдер выглядит так:

attribute vec4 position;
attribute vec4 color;

varying vec4 colorVarying;

uniform mat4 modelViewProjectionMatrix;

void main()
{
    gl_Position = modelViewProjectionMatrix * position;
    colorVarying = color;
}

Это делается так же в OpenGL ES 1.1? Кажется, мне нужно одно умножение матриц для каждого: glRotate, glScale, glTranslate ... Вызов - это мне кажется очень большим. Или есть лучший способ? (может с меньшим умножением матриц?)

Любая помощь по этой теме будет принята с благодарностью! Спасибо за чтение

Ответы [ 2 ]

4 голосов
/ 03 февраля 2011

Матрицы идентичности, перевода, поворота и масштабирования не требуют применения полного умножения матриц, потому что многие из терминов всегда равны 0,0 или 1,0.Если вы напишете поэлементные результаты умножения других матриц на эти матрицы, вы увидите, что у многих элементов может быть только несколько слагаемых, влияющих на их окончательные значения.Два простых примера:

  • С учетом единичной матрицы I и произвольной матрицы M , I × M = M × I = M .
  • Единственными ненулевыми элементами в матрице масштабирования S являютсячетыре по диагонали, которые мы назовем S 0 , S 1 , S 2 и S 3 .( S 3 всегда равно 1,0 для чего-то вроде glScalef.) S × M масштабирует n th ряд M по S n . M × S работает вместо столбца.Вы также можете думать о единичной матрице как о особенно скучной масштабирующей матрице.

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

0 голосов
/ 02 февраля 2011

Проверьте это: http://glm.g -truc.net / about.html

...