OpenGL深度缓冲区&正投影

时间:2015-07-14 21:36:28

标签: opengl jogl depth-buffer

我正在使用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库和相同的设置(当然除了反向映射),问题没有显示出来。

1 个答案:

答案 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进行了测试。这三个都表现出相同的行为。