【问题标题】:OpenTK vertices seem to always write to 0 in depth bufferOpenTK 顶点似乎总是在深度缓冲区中写入 0
【发布时间】: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


【解决方案1】:

好吧,经过几个小时的调试,我似乎已经让它工作了。为了将来参考,我认为我所做的修复它是在我的绘图函数中调用 GL.ClearDepth() 之后将我的 GL.DepthFunc() 和 GL.DepthMask() 调用移动到正确的位置,而不是我在初始化函数中的位置在 GL.Enable(EnableCap.DepthTest) 和 GL.DepthRange(0.1f, 1.0f) 旁边。希望这对将来的人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    相关资源
    最近更新 更多