OpenGL ES 2.0透视投影 - >立方体是矩形的

时间:2012-09-27 15:32:07

标签: iphone ios opengl-es opengl-es-2.0

[求助 - 见底部答案]

我正在尝试使用 iOS(iPhone)上的 OpenGL ES 2.0 绘制带透视的立方体,但它看起来像是一个矩形。

从我在网上搜集的内容来看,似乎与视口/投影矩阵有关,但我似乎无法指出实际原因。

如果我将视口设置为方形度量(宽度==高度),则绘制得非常好(立方体),但如果我正确设置(width = screen_width,height = screen_height),则立方体绘制为矩形形状

应该使用Viewport相应地设置Projection矩阵,使立方体保持立方体?!

我的代码(如果需要更多信息,请告诉我):

渲染方法:

// viewportSize is SCREEN_WIDTH and SCREEN_HEIGHT
// viewportLowerLeft is 0.0 and 0.0
ivec2 size = this->viewportSize;
ivec2 lowerLeft = this->viewportLowerLeft;
glViewport(lowerLeft.x, lowerLeft.y, size.x, size.y); // if I put size.x, size.x it draws well


mat4 projectionMatrix = mat4::FOVFrustum(45.0, 0.1, 100.0, size.x / size.y);

glUniformMatrix4fv(uniforms.Projection, 1, 0, projectionMatrix.Pointer());

矩阵操作:

static Matrix4<T> Frustum(T left, T right, T bottom, T top, T near, T far)
{
    T a = 2 * near / (right - left);
    T b = 2 * near / (top - bottom);
    T c = (right + left) / (right - left);
    T d = (top + bottom) / (top - bottom);
    T e = - (far + near) / (far - near);
    T f = -2 * far * near / (far - near);
    Matrix4 m;
    m.x.x = a; m.x.y = 0; m.x.z = 0; m.x.w = 0;
    m.y.x = 0; m.y.y = b; m.y.z = 0; m.y.w = 0;
    m.z.x = c; m.z.y = d; m.z.z = e; m.z.w = -1;
    m.w.x = 0; m.w.y = 0; m.w.z = f; m.w.w = 1;
    return m;
}
static Matrix4<T> FOVFrustum(T fieldOfView, T near, T far, T aspectRatio)
{
    T size = near * tanf(DEGREES_TO_RADIANS(fieldOfView) / 2.0);
    return Frustum(-size, size, -size / aspectRatio, size / aspectRatio, near, far);
}

2 个答案:

答案 0 :(得分:0)

如果您还没有想出来,请更改:

return Frustum(-size, size, -size / aspectRatio, size / aspectRatio, near, far);

return Frustum(-size / aspectRatio, size / aspectRatio, -size, size,, near, far);

它应该正确绘制。 (或者只是将size.x / size.y的比率更改为size.y / size.x)

答案 1 :(得分:0)

好的我发现了问题,size.x和size.y都是int,所以除法返回一个int。

1.0 * size.x / size.y

解决问题。 捂脸