2011-09-06 88 views
8

我試圖將我的OpenGL ES 1應用程序轉換爲OpenGL ES 2應用程序以便能夠使用着色器。現在我使用glOrthof函數來創建「真實大小的視口」,這樣我就可以將頂點放置在OpenGL視圖中的「實際」像素處。如何在OpenGL ES 2.0中實現glOrthof

glOrthof(0, _frame.size.width, _frame.size.height, 0, -1, 1); 

我無法找出如何在OpenGL ES 2做到這一點,是有任何人誰可以告訴我如何做到這一點?

如果沒有,有沒有人有一個好的鏈接OpenGL ES 1 to OpenGL ES 2教程/解釋?

回答

12

glOrtho方法除了創建一個新矩陣並將當前投影矩陣與該矩陣相乘外別無其他。有了OpenGL ES 2.0,你必須自己管理矩陣。爲了複製glOrtho行爲,您需要在頂點着色器中使用投影矩陣的均勻性,然後將頂點與頂點相乘。一般還具有模型和視圖矩陣(或組合的模型視圖矩陣,如在OpenGL ES 1)你與投影變換前的頂點變換:

uniform mat4 projection; 
uniform mat4 modelview; 

attribute vec4 vertex; 

void main() 
{ 
    gl_Position = projection * (modelview * vertex); 
} 

具體投影矩陣glOrtho構建體可以是發現here

+0

你能告訴我如何創建/加載投影和模型視圖嗎? – Thys

+0

@MrThys如果你不確定,你應該首先在OpenGL ES 2.0和GLSL着色器上查閱一些學習資源。基本上,一旦你有相應的統一的位置和着色器程序被綁定/使用,你可以用許多['glUniform ...'](http://www.opengl.org/sdk/docs /man/xhtml/glUniform.xml)調用,在矩陣的情況下,你會使用'glUniformMatrix4fv' –

+0

鏈接已經死亡... – B0rk4

10

正如Christian所描述的,處理頂點的所有矩陣數學都取決於您,因此您必須複製glOrthof()創建的矩陣。在我的回答here,我提供了一種用於生成這樣的正投影矩陣以下Objective-C的方法:

- (void)loadOrthoMatrix:(GLfloat *)matrix left:(GLfloat)left right:(GLfloat)right bottom:(GLfloat)bottom top:(GLfloat)top near:(GLfloat)near far:(GLfloat)far; 
{ 
    GLfloat r_l = right - left; 
    GLfloat t_b = top - bottom; 
    GLfloat f_n = far - near; 
    GLfloat tx = - (right + left)/(right - left); 
    GLfloat ty = - (top + bottom)/(top - bottom); 
    GLfloat tz = - (far + near)/(far - near); 

    matrix[0] = 2.0f/r_l; 
    matrix[1] = 0.0f; 
    matrix[2] = 0.0f; 
    matrix[3] = tx; 

    matrix[4] = 0.0f; 
    matrix[5] = 2.0f/t_b; 
    matrix[6] = 0.0f; 
    matrix[7] = ty; 

    matrix[8] = 0.0f; 
    matrix[9] = 0.0f; 
    matrix[10] = 2.0f/f_n; 
    matrix[11] = tz; 

    matrix[12] = 0.0f; 
    matrix[13] = 0.0f; 
    matrix[14] = 0.0f; 
    matrix[15] = 1.0f; 
} 

在此使用的矩陣被定義爲

GLfloat orthographicMatrix[16]; 

然後我我的頂點內應用矩陣着色器使用類似如下:

gl_Position = modelViewProjMatrix * position * orthographicMatrix; 

我的乘法順序不同於克里斯蒂安的,所以我可能會稍微做一些事情病房在這裏,但這是我在我的OpenGL ES 2.0應用程序中處理這個問題的方法(源代碼可以在here找到)。

+0

您的方法似乎完全匹配glOrthof手冊頁給出的公式(例如,http://www.opengl.org/sdk/docs/man/xhtml/glOrtho.xml) – Tommy

+2

正交矩陣實際上是投影矩陣,但'modelViewProjMatrix'這個名字表明你有另一個投影矩陣,這在概念上有點奇怪(儘管有效,但是着色器不可能)。但真正奇怪的是,您將左應用與矩陣轉換的正確應用混合到向量中。這就是你在'loadOrthoMatrix'例程中實際創建轉置矩陣的原因(以及爲什麼這個着色器代碼應該對任何不深入矩陣轉換的人造成混淆)。 –

+0

@Christian - 你真的可以說矩陣數學不是我的強項領域之一。着色器的命名從另一個實現中遺留下來,實際上應該只是第一個組件的模型視圖矩陣。我想這是兩個左派合適的情況,但是當我嘗試它時,它已經奏效了,所以我從來沒有質疑過爲什麼。謝謝你指出這裏的怪異。 –