Рассмотрим этот код 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 нет?
Конвейер старого стиля предназначен для использования графа сцены. Когда вы вводите новое преобразование, оно объединяется с текущим, поэтому для создания графа сцены вы можете поместить текущее преобразование в предоставленный стек при посещении дочерних узлов, применить локальное преобразование, сделать некоторые рендеринг, а затем снова откройте преобразование, чтобы вернуться к преобразованию родителя.
Для конвейера рендеринга / освещения GL также необходимо, чтобы он имел смысл используемых матриц, поэтому он разделен на «проекцию» и «вид модели».
Новый стиль конвейера ничего не делает. В этом конвейере вы указываете точную матрицу, с которой хотите рендериться. Когда вы указываете другую матрицу, она просто заменяет все, что там уже есть.
Ваш пример эквивалентен выполнению:
glLoadIdentity()
glRotate()
Так что нет непрерывного вращения.
Если вы хотите объединения, нажатия, выталкивания и т. Д., Вы сами должны реализовать это. Вам нужно будет сохранить предыдущее значение матрицы и умножить его. Или, в качестве альтернативы, обновите значение поворота.
Для этого есть много причин, не в последнюю очередь из-за того, что программируемый конвейер имеет менее строгое определение того, как вы можете преобразовывать вершины в любом случае, поэтому он оставляет конструкцию необходимых матриц программисту. Возможно, у вас даже нет матрицы, но вы можете построить преобразование в шейдере.
Других решений пока нет …