1

这发生在带有 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);
4

1 回答 1

1

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

是否启用了深度缓冲区?您是否在每一帧都清除它?

于 2012-08-06T21:25:29.507 回答