【问题标题】:iPhone OGLES Game Of Life PlottingiPhone OGLES 生活游戏
【发布时间】:2010-07-11 05:42:17
【问题描述】:

我正在为 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];
}

【问题讨论】:

    标签: iphone opengl-es


    【解决方案1】:

    实际上,在您的情况下,正确的解决方法是将您对 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 节所述,其中指出:

    在默认状态下,通过截断其 xwyw 坐标(回想一下,下标表示这些是 xy 窗口坐标)到整数。这个 (x, y) 地址,连同从与该点对应的顶点相关联的数据派生的数据,作为单个片段发送到每个片段阶段GL的。

    需要注意的重要一点是,一个点的窗口坐标是将模型视图和投影矩阵应用于该点的位置,然后按您的视口缩放的结果。在您的情况下,这最终将您的点的 xy 坐标乘以 backingWidthbackingHeight 的倒数,然后乘以 backingWidthbackingHeight同样,由于在计算的各个阶段进行浮点舍入,因此不能保证它们完全是整数。

    为了尽量减少任何舍入/截断将您的点置于您不期望的位置,您希望您的点的最终窗口坐标正好落在像素的中心。请记住,帧缓冲区中的像素(xy)实际上对应于一个矩形跨度(xy ) 到 (x+1, y+1),因此您希望在 xy。我发布的两个 sn-ps 都是这样做的,但方式不同。 (您只需执行其中一项即可。)

    【讨论】:

    • 我仍将回顾一下为什么这确实有效但确实有效!
    【解决方案2】:

    我发现我做错了什么......

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-30
      • 2011-03-05
      • 1970-01-01
      相关资源
      最近更新 更多