2010-07-10 67 views
0

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

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]; 
} 

回答

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瓦特ÿ瓦特坐标(回想下标表示这些是Xÿ窗口坐标)整数。这个(x,)地址连同从与该点对应的顶点相关联的数据导出的数据被作为单个片段发送到GL的每片段阶段。

需要注意的重要一点是,点的窗口坐标是将模型视图和投影矩阵应用到点的位置,然后通过视口缩放的结果。在你的情况,这卷起你的观点XY上的backingWidthbackingHeight倒数坐标由backingWidthbackingHeight乘以再次,那么,这是不能保证让他们精确的整数,因为浮点在计算的各个阶段四舍五入。

为了最大限度地减少任何出现的舍入/截断,将你的点放在你不期望的位置,你希望你的点的最终窗口坐标正好落在像素的中心。请记住,在帧缓存像素(Xÿ)实际上对应于一个矩形跨越(Xÿ)至(X +1,ÿ +1),所以你要在xy两者中移位0.5。我发布的这两个片段都是这样做的,但方式不同。 (你只需要做其中的一个。)

+0

我仍然要回顾一下为什么这种方法能够正常工作,但它确实有效! – Parad0x13 2010-07-11 19:48:12

0

...

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