这发生在带有 MonoTouch 5.3 的 GLKit 上,但我认为问题可能是一般的 OpenGL ES 2.0 性质。
我有三张脸,一张是红色的,一张是绿色的,一张是蓝色的,alpha 值都是 1.0,所以它们应该是不透明的。当它们在黑色背景上渲染时,一切正常。如果绿色的脸在其他人面前,那么一切都很好。但如果
- 红色的脸在绿色的前面
- 或者蓝脸在其他人的面前
前景色未渲染,但背景面完全可见。这似乎是某种混合效果,但我在我的代码中没有看到任何特别之处,并且我已经尝试了几种类似的东西glBlendFunc
,但它并没有改变任何东西。
我可以发布我的代码,但由于代码很简单,我想也许有人会立即知道答案。
更新:由于这似乎是一个深度排序问题,以下是代码的一些重要部分:
var aContext = new EAGLContext(EAGLRenderingAPI.OpenGLES2);
var view = this.View as GLKView;
view.Delegate = new GenericGLKViewDelegate(this);
view.Context = aContext;
view.DrawableColorFormat = GLKViewDrawableColorFormat.RGBA8888;
view.DrawableDepthFormat = GLKViewDrawableDepthFormat.Format16;
view.DrawableMultisample = GLKViewDrawableMultisample.Sample4x;
这是 DrawInRect 方法:
_baseEffect.PrepareToDraw();
GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
GL.EnableVertexAttribArray((int)GLKVertexAttrib.Position);
GL.EnableVertexAttribArray((int)GLKVertexAttrib.Color);
GL.VertexAttribPointer((int)GLKVertexAttrib.Position, 3, VertexAttribPointerType.Float, false, 0, _squareVertices);
GL.VertexAttribPointer((int)GLKVertexAttrib.Color, 4, VertexAttribPointerType.UnsignedByte, true, 0, _squareColors);
GL.DrawArrays(BeginMode.TriangleStrip, 0, 9);
GL.DisableVertexAttribArray((int)GLKVertexAttrib.Position);
GL.DisableVertexAttribArray((int)GLKVertexAttrib.Color);
ColorFormat
我尝试了,DepthFormat
和的所有可能组合Multisample
,但还是一样。
解决方案:
我错过了一些启用深度缓冲区的调用,方法中缺少这些调用ViewDidLoad
:
GL.ClearDepth(30);
GL.Enable(EnableCap.DepthTest);
GL.DepthFunc(DepthFunction.Lequal);