2013-04-24 245 views
0

我是一個新的透視分割現象。OpenGL中的透視投影矩陣

void MatrixPersp(Mat4& matrix,const float fovy, const float aspect, const float zNear, const float zFar) 
    { 
     float sine, cotangent, deltaZ; 
     float radians; 

     for(int i=0;i<4;i++) 
      for(int j=0;j<4;j++) 
      { 
       if(i==j) 
        matrix[i][j]=1.0; 
       else 
        matrix[i][j]=0.0; 
      } 

     radians = fovy/2 * GLES_Pi/180; 

     deltaZ = zFar - zNear; 
     sine = (float) sin(radians); 

     cotangent = (float) cos(radians)/sine; 

     matrix[0][0] = cotangent/aspect; 
     matrix[1][1] = cotangent; 
     matrix[2][2] = -(zFar + zNear)/deltaZ; 
     matrix[2][3] = -1; 
     matrix[3][2] = -2 * zNear * zFar/deltaZ; 
     matrix[3][3] = 0; 

     return;  
    } 

void Render() 
{ 
    GLfloat vertices[] = 
    { 
     -0.8,0.6,1.0,1.0, 
     -0.8,0.2,1.0,1.0, 
     0.2,0.2,1.0,1.0, 
     0.2,0.6,1.0,1.0 
    }; 

    MatrixPersp(perspective,90.0,aspect,2.0,100.0); 

    glUniformMatrix4fv(glGetUniformLocation(program_object,"MVPMatrix"), 1, GL_FALSE, (GLfloat*)perspective); 

    glClearDepth(1.0f); 
    glClear(GL_DEPTH_BUFFER_BIT); 

    glEnable(GL_DEPTH_TEST); 
    glDepthFunc(GL_LEQUAL); 


glDrawElements(); 

}

頂點着色引擎是:我使用下面的代碼在三維空間繪製一個簡單的方形

#version 150 

in vec4 position; 

uniform mat4 MVPMatrix; 

void main() 
{ 
     gl_Position = position*MVPMatrix; 

} 

這裏的問題是,當所有的四個頂點具有相同的Z - 值什麼都沒有呈現。另一方面,如果兩個頂點具有-1作爲z座標,則投影矩陣可以正常工作。 我不確定這裏發生了什麼問題。

回答

2
glUniformMatrix4fv(glGetUniformLocation(program_object,"MVPMatrix"), 1, GL_FALSE, (GLfloat*)perspective); 

這條線表明你的矩陣是按列主要的順序。這通過MatrixPersp函數計算矩陣的方式得到證實,具體取決於如何定義Mat4

gl_Position = position*MVPMatrix; 

如果MVPMatrix是正確列爲主,那麼這個乘法是倒退。位置在右側。

+0

:試過右邊的位置。沒有成功。 – maverick9888 2013-04-24 12:01:54

+2

@ maverick9888某些東西還是應該改變的。 *相同*錯誤是否發生,或者是否發生了新的事情? – Hydronium 2013-04-24 12:52:33

+0

@Hydronium:不幸的是,着色器編譯沒有錯誤。沒有新的事情發生:-( – maverick9888 2013-04-25 08:29:13