繁体   English   中英

OpenGL深度缓冲和正交投影

[英]OpenGL Depth buffer & ortho projection

我正在使用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);

谁能告诉我为什么会这样? 我使用glm库和相同的设置(当然除了反向映射)在C ++中编写了一个类似的程序,问题没有出现。

ortho调用中为zNear参数传递-1似乎很奇怪。 通常,近和远都是正的。

好的,将这些值传递给glOrtho是合法的,但也许并没有按照您的期望进行。 远平面比摄像机靠前1个单位,近平面比摄像机靠后1个单位。 但是由于摄像机沿-z方向看,远平面将在z = -1 ,而近平面将在z=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)将更靠近查看器。

我用GL11.glOrtho以及GLU.gluOrtho2D用JOML进行了测试。 这三个都显示相同的行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM