1

これは、MonoTouch 5.3 の GLKit で発生しますが、問題は一般的な OpenGL ES 2.0 の性質によるものである可能性があります。

赤、緑、青の 3 つの面があり、すべてアルファ値が 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 に答える