我正在使用Java和JOGL来做一些3D渲染。我使用JOML库生成我的视图和投影矩阵:
Matrix4f view = new Matrix4f()
.lookAt(new Vector3f(1.0f, 0.0f, 0.0f),
new Vector3f(0.0f, 0.0f, 0.0f),
new Vector3f(0.0f, 1.0f, 0.0f));
Matrix4f proj = new Matrix4f()
.ortho(-1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f);
我将这些矩阵发送到这样的着色器:
gl.glUniformMatrix4fv(viewTransformLocation, 1, false, viewTransformMatrix, 0);
gl.glUniformMatrix4fv(projectionTransformLocation, 1, false, projectionTransformMatrix, 0);
在此过程中,矩阵不会被转置。
填充我的VAO和VBO后,我只需使用以下状态来渲染网格:
gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
gl.glEnable(GL.GL_CULL_FACE);
gl.glCullFace(GL.GL_BACK);
gl.glEnable(GL.GL_DEPTH_TEST);
...
生成的图像非常奇怪,看起来深度缓冲区是反转的。在我试图扭转映射后,它就像一个魅力。
gl.glDepthRange(1,0);
谁能告诉我为什么会这样?我在C ++中编写了一个类似的程序,使用glm库和相同的设置(当然除了反向映射),问题没有显示出来。
答案 0 :(得分:1)
您可能正在经历具有较高Z坐标(朝向+ inf)的曲面隐藏具有小Z坐标(朝向-inf)的曲面。
如果对zMin使用负值而对zMax使用正值,则这是正确的行为。 看看http://www.songho.ca/opengl/gl_projectionmatrix.html#ortho。 在“正交投影”部分中,您可以看到第一个图像,其中+ Z矢量指向“屏幕外”朝向查看者。这也是您的Z坐标也将被解释的方式。较大的值比较小的值更接近观众。
当您交换zNear和zFar的符号时,事情会发生变化,使zNear为正,zFar为负。然后,你的+ Z点“进入屏幕”并远离观众。在那里,表面的较小Z值(朝向-inf)将更接近观察者。
我用JOML,GL11.glOrtho以及GLU.gluOrtho2D进行了测试。这三个都表现出相同的行为。