【发布时间】:2014-09-29 18:30:40
【问题描述】:
所以我有一个 2D 游戏引擎,我正在努力添加一个深度缓冲区,这样我就可以随意在彼此的前后绘制东西。我让我的 GameWindow 在初始化时创建一个深度缓冲区,启用深度测试,将 depthFunction 更改为 DepthFunction.Less,将 DepthMask 设置为 true,将 DepthRange 设置为 0.0-1.0,并将所有 GL.Vector2 调用更改为 GL.Vector3调用 z 是我希望它绘制的深度。然而,每当我绘制任何东西时,无论我传递给 GL.Vector3 的 z 值如何,它似乎都在深度 0 处绘制。我有三个矩形被绘制在彼此之上,偏移量略有不同。红色的深度为 0,蓝色的深度为 1,紫色的深度为 0.5f,它们是按此顺序绘制的(红-蓝-紫),看起来像 image1。 但是,如果我将 DepthFunc 更改为 DepthFunction.Lequal,我会在 image2 中得到结果。除了顶点的 z 值之外,在绘制顶点以定义它们的深度时,我还需要设置什么吗?我也有这个代码的正交矩阵设置:
GL.MatrixMode(MatrixMode.Projection);
GL.LoadIdentity();
GL.Ortho(-window.ClientSize.Width / 2f, window.ClientSize.Width / 2f,
window.ClientSize.Height / 2f, -window.ClientSize.Height / 2f, 0.0f, 1.0);
这有关系吗?
图像1:http://i.stack.imgur.com/bqUT0.png 图片2:http://i.stack.imgur.com/EUaMk.png
【问题讨论】:
-
你做过
glEnable(GL_DEPTH_TEST)的等价物吗?如果未启用深度测试,则设置深度函数和范围将毫无意义。 -
是的,我做了 GL.Enable(EnableCap.DepthTest);
-
尝试将您的近剪裁平面移动到 0.1 - 那么它可以工作吗? glFrustum 中的注释解释了为什么 znear 不能为 0.0。
-
抱歉回复太长了。我一直很忙。我已经尝试将 zNear 移动到 0.1f 并且它不会绘制任何东西,无论我将 DepthFunc 设置为什么。即使我将 DepthFunc 设置为 Always,它也不会绘制任何东西
标签: c# opengl 2d opentk depth-buffer