使用GLKit在OpenGL ES 2.0中实现奇怪的混合效果

时间:2012-08-06 21:16:53

标签: ios opengl-es xamarin.ios opengl-es-2.0 glkit

在使用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);

我尝试了ColorFormatDepthFormatMultisample的所有可能组合,但它仍然是相同的。

解决方案:

我错过了一些启用深度缓冲区的调用,ViewDidLoad方法中缺少这些调用:

        GL.ClearDepth(30);
        GL.Enable(EnableCap.DepthTest);
        GL.DepthFunc(DepthFunction.Lequal);

1 个答案:

答案 0 :(得分:1)

这听起来不像混合问题 - 而是深度排序问题。

是否启用了深度缓冲?你是用每一帧清除它吗?