c++ - 2D opengl旋转导致 Sprite 失真

标签 c++ ios rotation opengl-es-2.0 glm-math

我对使用 OpenGL ES 2.0 还很陌生。我也在使用 iPhone 和 GLM 数学库。正如我所提到的,我经常使用本教程:http://tomdalling.com/blog/modern-opengl/03-matrices-depth-buffering-animation/但是我发现很难找到 2D OpenGL 教程。

我正在尝试旋转 2D Sprite ,但图像扭曲了。 例如,旋转角度为 0 度:http://i.imgur.com/yBTN2ST.png并以 45 度的旋转角度:http://i.imgur.com/cY5IJcg.png

在我的 Sprite 类中

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;

更好的是(避免将两个 4x4 矩阵相乘):

gl_Position = projection * ( model * newPosition );

甚至更好:在您的应用程序中乘以您的矩阵,并在您的着色器中执行单个矩阵 vector 乘法。您可能还应该在矩阵中包含翻译。

关于c++ - 2D opengl旋转导致 Sprite 失真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17212180/

相关文章:

c++ - 如何在 cout 语句后打印 void 函数?

c++ - CLion 中的重构不起作用

ios - 从右到左的 Cocoa Touch 界面

ios - 以编程方式将 UITabBarController 添加到 UIWindow 后失去旋转支持

android - 方向改变时视频重新开始

c++ - 使用数据类型转换 float 的字符串

c++ - 在 C++ 中通过套接字发送图像时出现 "The image cannot be displayed error"

ios - Testflight 应用程序需要 iOS 8。我们如何使用 iOS 7 进行 Beta 测试?

ios - 通用导航按钮操作另一个类

android - 打开“编辑”对话框并旋转设备时,应用崩溃