2012-09-06 92 views
4

從OpenGL ES1.1移植到2.0用於2D目的(拼寫),並且我在計算如何應用轉換(矩陣乘法順序)時遇到了一些問題。我只需要在Z軸上旋轉,並且在X和Y上的比例總是相同的值,所以這應該顯着簡化事情。 我當前使用的方法(ES1.1)有一個虛擬相機,它位於與對象相同的絕對座標空間中。OpenGL ES2.0模型視圖矩陣2D

在每幀我先做相機的轉換的開始通過調用

glRotatef(angle, 0.0f, 0.0f, 1.0f); 
    glScalef(zoom, zoom, 0.0f); 
    glTranslatef(-pos.x, -pos.y, 0.0f); // negative position to shift everything back to the center of the view 

對於對象,它看起來像這樣(省略了紋理和繪圖調用)。

glPushMatrix(); // to preserve camera transform 
    glTranslatef(pos.x, pos.y, 0.0f); 
    glScalef(scale, scale, 0.0f); 
    glRotatef(angle, 0.0f, 0.0f, 1.0f); 
    // drawing done here 
    glPopMatrix(); 

我想在ES2.0中得到這個相同的功能,但所有的矩陣操作都必須手動執行。

this link我發現multiplaction的正確順序應該是((秤*旋轉)*翻譯)

下面,我想出了將所有的這些單一基質配方,因爲2D是簡單得多。我也有一個正交投影矩陣。 對於測試着色器我有這樣的:

attribute vec4 position; 
    attribute vec4 color; 

    varying vec4 colorVarying; 

    uniform vec2 translate; 
    uniform float rotate; 
    uniform float scale; 
    uniform vec4 camera; // x, y, z = angle, w = zoom 

    void main() 
    { 

     const float w = 3.2; 
     const float h = 4.8; 

     mat4 projection = mat4(1.0/w, 0.0, 0.0, 0.0, 
         0.0, 1.0/h, 0.0, 0.0, 
         0.0, 0.0, -1.0, 0.0, 
         0.0, 0.0, 0.0, 1.0); 

     float s1 = scale * sin(rotate); 
     float s2 = scale * cos(rotate); 

     mat4 m = mat4(s2, s1, 0.0, 0.0, 
       -s1, s2, 0.0, 0.0, 
       0.0, 0.0, 1.0, 0.0, 
       translate.x, translate.y, 0.0, 1.0); 

     gl_Position = projection * m * position; 

     colorVarying = color; 
    } 

這工作就像它應該自由的每一度。 但是,我無法弄清楚如何合併相機。着色器中矩陣的乘法順序與gl調用的順序不匹配,所以我不確定如何將相機調用轉換爲乘法。 起初我還試圖計算相機一個單獨的穿越 - 矩陣,這樣設置的最終位置:

gl_Position = projection * cam * m * position; 

,我不認爲這是正確的不分先後順序的相機矩陣本身(我嘗試了多種方式,沒有一個正確地工作)。我相信所有的相機和對象模型視圖變換必須被編譯成單個模型視圖矩陣(每個矩陣乘以最後一個,從相機變形開始,然後是對象,但顯然是按照特定的順序)。 這個操作順序是我很困惑的,特別是因爲它與ES1.1中正常工作的不匹配。

有人可以解釋正確的順序,以及爲什麼gl調用不同於實際的乘法?

+0

謝謝,這個帖子真讓我開始! – dac2009

回答

5

如果這是在OpenGLES 1.1

glRotatef(angle, 0.0f, 0.0f, 1.0f); //camera 
glScalef(zoom, zoom, 0.0f);   //camera 
glTranslatef(-pos.x, -pos.y, 0.0f); //camera 

glTranslatef(pos.x, pos.y, 0.0f); //model 
glScalef(scale, scale, 0.0f);  //model 
glRotatef(angle, 0.0f, 0.0f, 1.0f); //model 

然後在OpenGLES 2等效操作爲你工作。0將是(以相同的順序一切):

modelViewMatrix = camRotate * 
        camScale * 
        camTranslate * 
        objTranslate * 
        objScale * 
        objRotate; 

到投影矩陣補充,只是追加其左側:

mvpMatrix = proj * modelViewMatrix; 

要轉換的頂點,乘以它的權:

transformed = mvpMatrix * in_vert; 
1

後glPushMatrix,的glTranslatef,glScalef,glRotatef,glPopMatrix你會得到你矩陣推到堆棧。所以它沒有什麼。

但無論如何,如果你想矩陣repoduces順序執行的XForms(的glTranslatef,glScalef,glRotatef),你需要乘以相同的順序(翻譯*比例)*旋轉

+0

我注意到你在翻譯*範圍內放了括號,但這可能有點誤導,因爲它們當然不是必需的。 (A * B)* C與A *相同(B * C)與A * B * C相同。 – Tim

+0

是的,它只是讓順序更清晰 – ChatCloud

+0

對不起,我應該更清楚了,我省略了我的繪圖調用來減少混亂,但是我在繪製矩陣之前繪製每個對象(或精靈)。 – user1137704

相關問題