2010-07-10 96 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);