我正在研究旋转网格,除了在旋转的某些阶段之外,它在大多数情况下都可以正常工作。例如:
前
介于两者之间
后
正如你所看到的,就像 OpenGL 改变了它对前面的东西的看法。有趣的是,前后两个阶段本身看起来都很“正常”,尽管它们是一种相互逆转。(这是一种迷幻的光学效果,但不是我想要的。)
我正在使用 GLKit 在 iOS 6 中编程。
我不知道我的问题是与设置和绘图代码有关,还是与我进行旋转的方式有关。任何见解将不胜感激。
我正在研究旋转网格,除了在旋转的某些阶段之外,它在大多数情况下都可以正常工作。例如:
前
介于两者之间
后
正如你所看到的,就像 OpenGL 改变了它对前面的东西的看法。有趣的是,前后两个阶段本身看起来都很“正常”,尽管它们是一种相互逆转。(这是一种迷幻的光学效果,但不是我想要的。)
我正在使用 GLKit 在 iOS 6 中编程。
我不知道我的问题是与设置和绘图代码有关,还是与我进行旋转的方式有关。任何见解将不胜感激。
发布后很高兴找到我的答案。只需要启用深度缓冲区。
view.drawableDepthFormat = GLKViewDrawableDepthFormat16;
(视图是你的GLKView*
)
感谢 Ray Wenderlich 的精彩解释:
drawableDepthFormat
您的 OpenGL 上下文还可以选择有另一个与之关联的缓冲区,称为深度缓冲区。这有助于确保更靠近观察者的对象显示在更远的对象前面。
默认情况下,OpenGL 的工作方式是在缓冲区中的每个像素处存储离查看器最近的对象。当它要绘制一个像素时,它会检查深度缓冲区以查看它是否已经绘制了更靠近观察者的东西,如果是则丢弃它。否则,它将它添加到深度缓冲区和颜色缓冲区。
您可以设置此属性来选择深度缓冲区的格式。默认值为 GLKViewDrawableDepthFormatNone,这意味着根本没有启用深度缓冲区。
但是如果你想要这个特性(你通常为 3D 游戏做),你应该选择 GLKViewDrawableDepthFormat16 或 GLKViewDrawableDepthFormat24。这里的权衡是使用 GLKViewDrawableDepthFormat16,您的应用将使用更少的资源,但是当对象彼此非常接近时,您可能会遇到渲染问题。