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