在使用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);
答案 0 :(得分:1)
这听起来不像混合问题 - 而是深度排序问题。
是否启用了深度缓冲?你是用每一帧清除它吗?