Почему в OpenGL ES 2.0 нет необходимости в эквивалентности матрицы push / pop?

Рассмотрим этот код OpenGL ES 1.1, называемый каждым кадром:

glPushMatrix();
glRotatef(m_currentAngle, 0, 0, 1);

//... enable, point, draw vertices

glPopMatrix();

Все хорошо. Теперь, если я удаляю push / pop, я получаю анимацию непрерывного вращения, что имеет смысл.

Тем не менее, в ES 2.0, вот эквивалентный эффект:

 //no glRotate so doing this:
float radians = m_currentAngle * 3.14159f / 180.0f;
float s = std::sin(radians);
float c = std::cos(radians);
float zRotation[16] = {
c, s, 0, 0,
-s, c, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1
};
GLint modelviewUniform = glGetUniformLocation(m_simpleProgram, "Modelview");
glUniformMatrix4fv(modelviewUniform, 1, 0, &zRotation[0]);

//... then enable, point and draw vertices

Это также создает правильное изображение, но, несмотря на ничто, эквивалентное технике «push / pop», оно делает не непрерывно вращаться. Почему 2.0 не непрерывно вращается, а 1.1 вращается?

Или сформулированный по-другому, почему 1.1 требует push / pop для предотвращения непрерывной анимации, а 2.0 нет?

1

Решение

Конвейер старого стиля предназначен для использования графа сцены. Когда вы вводите новое преобразование, оно объединяется с текущим, поэтому для создания графа сцены вы можете поместить текущее преобразование в предоставленный стек при посещении дочерних узлов, применить локальное преобразование, сделать некоторые рендеринг, а затем снова откройте преобразование, чтобы вернуться к преобразованию родителя.

Для конвейера рендеринга / освещения GL также необходимо, чтобы он имел смысл используемых матриц, поэтому он разделен на «проекцию» и «вид модели».

Новый стиль конвейера ничего не делает. В этом конвейере вы указываете точную матрицу, с которой хотите рендериться. Когда вы указываете другую матрицу, она просто заменяет все, что там уже есть.

Ваш пример эквивалентен выполнению:

glLoadIdentity()
glRotate()

Так что нет непрерывного вращения.

Если вы хотите объединения, нажатия, выталкивания и т. Д., Вы сами должны реализовать это. Вам нужно будет сохранить предыдущее значение матрицы и умножить его. Или, в качестве альтернативы, обновите значение поворота.

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

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]