これは、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);