我有这种执行正射投影的方法:
void myGL::ApplyOrtho(float maxX, float maxY) const
{
float a = 1.0f / maxX;
float b = 1.0f / maxY;
float ortho[16] = {
a, 0, 0, 0,
0, b, 0, 0,
0, 0, -1, 0,
0, 0, 0, 1};
GLint projectionUniform = glGetUniformLocation(m_simpleProgram, "Projection");
glUniformMatrix4fv(projectionUniform, 1, 0, &ortho[0]);
}
当我这样做时,它适用于 iPad 屏幕:
ApplyOrtho(2, 2*1024/768);
这是我的渲染图像:
但是,当我旋转到横向时,它看起来像这样:
现在我的假设是,这是因为ApplyOrtho
矩阵设置了一个固定的投影,并且当图像在该投影内旋转时,该投影不会旋转,因此显示得更胖。
顺便说一下,这是轮换:
void myGL::ApplyRotation(float degrees) const
{
float radians = degrees * 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]);
}
它在绘图之前使用。
所以我在旋转的同时进行了实验和尝试:
ApplyOrtho(2*1024/768, 2);
然而,这没有任何影响,即使旋转肯定是同时发生的。我的形象仍然“胖”。
我对为什么会发生肥胖的解释正确吗?
自动旋转屏幕时如何处理正投影?
UDPATE:还在 iPhone 上使用 2/3 尺寸的屏幕(不是 iPhone 5)并使用ApplyOrtho(2,3)
,ApplyOrtho(3,2)
但横向中的“胖”三角形仍然存在。
另外:视口只设置一次,在第一个 Ortho 之前:
glViewport(0, 0, width, height);
其中宽度和高度是纵向屏幕的尺寸。