Я совершенно новичок в использовании OpenGL ES 2.0. Также я использую iPhone и библиотеку математики GLM. Как я уже упоминал, я много использовал этот урок: http://tomdalling.com/blog/modern-opengl/03-matrices-depth-buffering-animation/ Но мне было трудно найти учебник по 2D OpenGL.
Я пытаюсь повернуть 2D-спрайт, но изображение искажается.
Например, при угле поворота 0 градусов: http://i.imgur.com/yBTN2ST.png и при угле поворота 45 градусов: http://i.imgur.com/cY5IJcg.png
В моем классе спрайтов
glm::mat4 projection = glm::ortho(0.0f, 480.0f, 0.0f, 320.0f);
glUniformMatrix4fv(projectionUniform, 1, GL_FALSE, glm::value_ptr(projection));
glm::mat4 newModel = glm::rotate(glm::mat4(), 0.0f, glm::vec3(0, 0, 1));
glUniformMatrix4fv(modelUniform, 1, GL_FALSE, value_ptr(newModel));
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
В моем вершинном шейдере
vec4 newPosition = vec4(position + offset, 0.0, 1.0);
gl_Position = model * projection * newPosition;
Я думаю, что часть проблемы заключается в том, что изображение поворачивается без учета соотношения сторон. Я не совсем уверен, как это исправить.
Спасибо
Я думаю, что вы применяете свои преобразования в неправильном порядке.
Вместо:
gl_Position = model * projection * newPosition;
пытаться:
gl_Position = projection * model * newPosition;
Еще лучше (чтобы избежать умножения двух матриц 4х4):
gl_Position = projection * ( model * newPosition );
Еще лучше: умножьте свои матрицы в своем приложении и выполните одно умножение матрицы на вектор в своем шейдере. Вы, вероятно, должны также включить перевод в матрицу.
Других решений пока нет …