繁体   English   中英

使用GLKit在OpenGL ES 2.0中产生奇怪的混合效果

[英]Strange blending effect in OpenGL ES 2.0 using GLKit

发生在具有MonoTouch 5.3的GLKit上,但是我认为问题可能是一般的OpenGL ES 2.0性质。

我有3张脸,其中一张是红色,一张绿色和一张蓝色,所有的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);

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM