在 OpenGL ES 2 上渲染简单正方形的错误转换 (iOS)

Wrong Transformation Rendering a Simple Square on OpenGL ES 2 (iOS)

我正在从头学习 OpenGL ES2(我的 Reference)。我想在屏幕中央渲染一个大小为 2 的简单正方形。

这是我的正方形(2 个三角形):

typedef struct {
    float Position[3];
    float Color[4];
} Vertex;

const Vertex Vertices[] = {
    {{1, -1, 0}, {1, 0, 0, 1}},
    {{1, 1, 0}, {0, 1, 0, 1}},
    {{-1, 1, 0}, {0, 0, 1, 1}},
    {{-1, -1, 0}, {0, 0, 0, 1}}
};

const GLubyte Indices[] = {
    0, 1, 2,
    2, 3, 0
};

我在 Google 上将图层、上下文、渲染设置为一些流行的示例。

这是我的顶点着色器:

attribute vec4 Position; // 1
attribute vec4 SourceColor; // 2

varying vec4 DestinationColor; // 3

uniform mat4 Projection;

void main(void) { // 4
    DestinationColor = SourceColor; // 5
    gl_Position = Projection * Position;
}

这是我的渲染函数:

-(void)render:(CADisplayLink*)displayLink
{
    glViewport(0, 0, self.frame.size.width, self.frame.size.height);
    glClearColor(0, 104.0/255.0, 55.0/255.0, 1.0);
    glClear(GL_COLOR_BUFFER_BIT);

    // Setup Projection Matrix
    GLfloat aspect = self.frame.size.height / self.frame.size.width;
    //GLKMatrix4 mat = GLKMatrix4MakeFrustum(-2, 2, -2*aspect, 2*aspect, 2, 100);
    GLKMatrix4 mat = GLKMatrix4MakeOrtho(-2.0, 2.0, -2.0*aspect, 2.0*aspect, 0, 100);
    glUniformMatrix4fv(_projectionUniform, 1, 0, mat.m);

    // Setup color & vertices
    glVertexAttribPointer(_positionSlot, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0);
    glVertexAttribPointer(_colorSlot, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*) (sizeof(float) * 3));

    // Draw...
    glDrawElements(GL_TRIANGLES, sizeof(Indices)/sizeof(Indices[0]),
               GL_UNSIGNED_BYTE, 0);

    [_context presentRenderbuffer:GL_RENDERBUFFER];
}

我设置了 Othor 项目矩阵,宽度为 4,高度为 1.77*4(iPhone 的 16:9)。我希望屏幕中央有一个正方形,但我得到的却是一个矩形:

大小和位置不是我所期望的。我做错了什么 ? 我也更改为 GLKMatrix4MakeFrustum,但也收到相同的结果。

你也可以在这里下载我的项目: https://www.mediafire.com/?w0tb74z5tk0xig0

感谢您阅读我的长问题。

经过半天的逐行检查代码。

我发现 AutoLay-Out 是问题的原因。关闭自动布局,一切正常。

只是不要使用自动布局来调整 OPENGL 视图的大小。也许它会影响由 OpenGL 渲染的 CA 层。