2011-11-21 51 views
3

我將固定函數OpenGL 1.x的代碼庫移植到OpenGL 2.x - 技術上OpenGL ES 2.0,但我仍然在桌面上編碼,只是牢記在心ES 2.0強加的限制類似於3.1'新'配置文件。沒有ftransform的桌面GLSL()

問題是,它看起來像2D以外的其他任何東西,創建一個着色器在modelviewprojection矩陣中傳遞,因爲制服不起作用。通常我會看到一個黑色的屏幕,但是如果我將所有頂點的Z值設置爲0,我會得到一些東西來顯示。

把我的着色器RenderMonkey的工作時,我有ES啓用2.0模式,但在標準桌面GL它只是一個黑色屏幕(沒有編譯器錯誤/警告):

VERT着色器:

uniform mat4 mvp_matrix; 
uniform mat4 obj_matrix; 
uniform vec4 u_color; 
attribute vec3 a_vertex; 
attribute vec2 a_texcoord0; 

varying vec4 v_color; 
varying vec2 v_texcoord0; 

void main(void) 
{ 
    v_color = u_color; 
    gl_Position = mvp_matrix * (obj_matrix * vec4(a_vertex, 1.0)); 
    v_texcoord0 = a_texcoord0; 
} 

FRAG着色器:

uniform sampler2D t_texture0; 
varying vec2 v_texcoord0; 
varying vec4 v_color; 

void main(void) 
{ 
    vec4 color = texture2D(t_texture0, v_texcoord0); 
    gl_FragColor = color * v_color; 
} 

我傳遞在矩陣作爲glUniformMatrix4fv(位置,如圖1所示,GL_FALSE,mvpMatrix); 這個着色器的工作原理與2D中繪製的任何東西一樣。我在這裏做錯了什麼?或者我需要在桌面GL上使用ftransform()?

+0

什麼是「objMatrix」,它與「mvpMatrix」有什麼不同?這些矩陣的內容是什麼? –

+0

objMatrix是任何繪製的局部變換,而mvpMatrix包含相機(模型視圖)和投影矩陣(模型* proj)的變換。在我的特殊測試中,我已經將objMatrix設置爲Identity。當投影設置爲我的glOrtho替換時,使用所有這些矩陣的轉換在2D中也可以很好地工作。但最大的問題是,我很好奇這個着色器爲什麼在ES 2.0模式下設置RenderMonkey,而不是在桌面上(也沒有編譯器錯誤或警告)。我在想這是我問題的根源。 – user1054922

+0

P.S.我還從我的應用的舊版OpenGL 1.1版本中導出了一個有效的模型&proj矩陣,並將其直接轉儲到OpenGL ES 2.x版本中,但仍然沒有顯示。使我更加確定它是着色器的問題,還是將矩陣傳遞給着色器。 – user1054922

回答

6

一兩件事,我覺得需要一點澄清:從物體座標爲世界座標

  • 模型矩陣變換物體。
  • 視圖矩陣將世界座標轉換爲眼睛座標。
  • 投影矩陣將眼睛座標轉換爲剪輯座標。

基於標準命名約定,mvpMatrix是投影*視圖*模型,按此順序。沒有其他矩陣需要乘以。投影是您的投影矩陣(正交或透視),視圖是相機變換矩陣(不是模型視圖),模型是對象的位置,比例和旋轉。

我認爲這個問題要麼是不需要乘法的乘法矩陣,要麼是乘法矩陣按照錯誤的順序。 (矩陣乘法不可交換)

如果您還沒有解決這個問題,我建議將所有3個矩陣分開發送並稍後將值返回以確保沒有問題發送矩陣。

頂點着色器:

attribute vec4 a_vertex; 
attribute vec2 a_texcoord0; 

varying vec2 v_texcoord0; 

uniform mat4 projection; 
uniform mat4 view; 
uniform mat4 model; 

void main(void) 
{ 
    gl_Position = projection * view * model * a_vertex; 
    v_texcoord0 = a_texcoord0; 
} 

片段着色器:

uniform sampler2D t_texture0; 
uniform vec4 u_color; 

varying vec2 v_texcoord0; 

void main(void) 
{ 
    vec4 color = texture2D(t_texture0, v_texcoord0); 
    gl_FragColor = color * u_color; 
} 

此外,我提出的顏色均勻的FRAG着色器,使其通過作爲不同的是不必要的,當所有的頂點將具有相同的顏色。