2015-03-24 64 views
0

我想用OpenGL在Java中使用LWJGL3渲染一個簡單的三角形。 一切都很好,但投影矩陣(透視)不起作用。在C++中,我只是用於應用glm::perspective()方法,它的工作非常棒。但是在Java中,我自己實現了它,因爲沒有像GLM這樣的庫來處理它。 所以這裏在Java透視代碼:Java OpenGL透視矩陣不起作用

public mat4 perspective(float fov, float aspect, float zNear, float zFar){ 
     mat4 projection = new mat4(); 

     float halfTanFov = (float) Math.tan(Math.toRadians(fov/2)); 
     float frustum = zNear - zFar; 

     projection.m[0][0] = 1f/halfTanFov * aspect; 
     projection.m[1][1] = 1f/halfTanFov; 
     projection.m[2][2] = - ((zNear + zFar)/frustum); 
     projection.m[2][3] = 2 * zFar * zNear/frustum; 
     projection.m[3][2] = 1; 

     return projection; 
    } 

我創建了mat4類,這是我如何申請一個乘法:

for(int i=0; i<4; i++) 
      for(int j=0; j<4; j++){ 
       result.m[i][j] = matrix.m[i][0] * m[0][j] + 
           matrix.m[i][1] * m[1][j] + 
           matrix.m[i][2] * m[2][j] + 
           matrix.m[i][3] * m[3][j]; 
      } 

當然我測試此乘一個比較結果與我的TI輸出,它運作良好。 其他信息,爲mat4類的默認constructor是把所有的數值爲0 這裏是代碼:

public void setZero(){ 
     m[0][0] = 0; m[0][1] = 0; m[0][2] = 0; m[0][3] = 0; 
     m[1][0] = 0; m[1][1] = 0; m[1][2] = 0; m[1][3] = 0; 
     m[2][0] = 0; m[2][1] = 0; m[2][2] = 0; m[2][3] = 0; 
     m[3][0] = 0; m[3][1] = 0; m[3][2] = 0; m[3][3] = 0; 
    } 

在另一方面viewMatrix()是偉大的工作。這是lookAt()方法的簡單實現。 所以當它是lookAtMatrix * modelMatrix * position那裏的vec4 position的結果是好的。 但是,當我嘗試添加投影矩陣的MVP:perspective * lookatMatrix * model * position結果是什麼。 在這裏,我做的代碼:

public mat4 getViewProjection() { 
    mViewProjection = Transform.getInstance().lookAt(mPosition, mPosition.add(mDirection), mUp); 
    return mViewProjection; 
} 
public mat4 getMVP(mat4 model){ 
    return mPerspective.mult(getViewProjection()).mult(model); 
} 

這裏是我的簡單的GLSL着色器(用於頂點着色器):

#version 430 

layout(location=0) in vec3 position; 
uniform mat4 MVP; 

void main(void){ 
    gl_Position = MVP * vec4(position, 1); 
} 

我試過其他執行沒有成功的角度來看的,所以我猜猜我的錯誤是在別的地方,但遺憾的是,我無法弄清楚在哪裏。如果有人能幫忙,那會很棒!謝謝。 如果您有其他信息,請問我,我會發布它。

回答

0

可能還有其他定義投影矩陣的方法。但至少與我通常在OpenGL中使用的投影矩陣相比,你有兩個倒立的符號。在此:

projection.m[0][0] = 1f/halfTanFov * aspect; 
projection.m[1][1] = 1f/halfTanFov; 
projection.m[2][2] = - ((zNear + zFar)/frustum); 
projection.m[2][3] = 2 * zFar * zNear/frustum; 
projection.m[3][2] = 1; 

,如果你想你的相機在積極 z軸方向看在眼座標空間的跡象實際上可能是好的。相機俯視負向 z軸更爲常見。

更重要的是,它看起來像你的矩陣轉置。至少只要您按列主要順序指定矩陣,這是通常使用OpenGL完成的方式,並且與您發佈的代碼看起來一致。

有了這兩個修正,代碼應該是:

projection.m[0][0] = 1f/halfTanFov * aspect; 
projection.m[1][1] = 1f/halfTanFov; 
projection.m[2][2] = (zNear + zFar)/frustum; 
projection.m[3][2] = 2 * zFar * zNear/frustum; 
projection.m[2][3] = -1f;