iPhone OGLES生命游戏绘图

时间:2010-07-10 02:34:57

标签: iphone opengl-es

我正在为iPhone开发一个OpenGL-ES生命游戏程序,我有一个包含整个网格的布尔值的数组,我为网格数组所做的是:

grid = (BOOL *)malloc(2*XSize*YSize*sizeof(BOOL));

我想知道将这个线性数组绘制到屏幕上的好方法。

我试图创建Vertices数组,然后通过glDrawArray绘图,但我似乎无法正确,所以我想知道是否有其他人可以帮助我。这是我正在尝试的方法,当渲染时由于某种原因创建工件:

- (void)GridToVertices {
    int current = 0;

    for(int y=-backingHeight/2;y<backingHeight/2;y++) {
        for(int x=-backingWidth/2;x<backingWidth/2;x++) {
            Vertices[current] = x;
            Vertices[current+1] = y;
            current+=2;
        }
    }
}

然后渲染它:

- (void)render {
    [self GridToVertices];
    [self GridToColors];

    [EAGLContext setCurrentContext:context];

    glBindFramebufferOES(GL_FRAMEBUFFER_OES, defaultFramebuffer);
    glViewport(0, 0, backingWidth, backingHeight);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    float Left = -backingWidth/2;
    float Right = backingWidth/2;
    float Up = -backingHeight/2;
    float Down = backingHeight/2;
    glOrthof(Left, Right, Up, Down, -1.0f, 1.0f);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    glVertexPointer(2, GL_FLOAT, 0, Vertices);
    glEnableClientState(GL_VERTEX_ARRAY);
    glColorPointer(4, GL_UNSIGNED_BYTE, 0, Colors);
    glEnableClientState(GL_COLOR_ARRAY);

    glDrawArrays(GL_POINTS, 0, [grid resolution]);

    glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer);
    [context presentRenderbuffer:GL_RENDERBUFFER_OES];
}

2 个答案:

答案 0 :(得分:0)

我弄清楚我做错了什么......

glOrthof(左,右-1,上,下-1,-1.0f,1.0f);

答案 1 :(得分:0)

实际上,正确的解决方法是将您的号召改为glOrthof

glOrthof(Left-0.5f, Right-0.5f, Up-0.5f, Down-0.5f, -1.0f, 1.0f);

或以原始格式致电glOrthof,并在设置模型视图矩阵时添加翻译:

glTranslatef(0.5f, 0.5f, 0.0f);

其原因来自于点光栅化的OpenGL ES规则,如specification的3.3.1节所述,其中指出:

  

在默认状态下,通过截断其 x w y w 坐标来对点进行栅格化(回想一下,下标表明这些是 x y 窗口坐标)到整数。此( x y )地址,以及从与该点对应的顶点关联的数据派生的数据,作为单个片段发送到每个片段阶段GL。

需要注意的重要一点是,点的窗口坐标是将模型视图和投影矩阵应用于点的位置,然后通过视口缩放的结果。在您的情况下,这会使您的点' x y 坐标乘以backingWidthbackingHeight的倒数,然后乘以{{1 }}和backingWidth再次,由于在计算的各个阶段进行浮点舍入,因此无法保证它们完全不变。

为了最大限度地减少任何圆角/截断的发生,将您的点放在您不期望的位置,您希望您的点的最终窗口坐标正好位于像素的中心。请记住,帧缓冲区中的像素( x y )实际上对应于跨越的矩形( x y )到( x +1, y +1),所以你想在 x y <中将它们移动0.5 / em>的。我发布的两个片段都是这样做的,但是以不同的方式。 (你只需要做其中一个。)