從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調用不同於實際的乘法?
謝謝,這個帖子真讓我開始! – dac2009