1

iOS 5でMonoTouchを使用して深度バッファーを機能させることができません。標準のMonoTouch「OpenGLアプリケーション」テンプレートを使用しており、深度バッファー(OpenGL ES 1.1)をテストするためにこのコードを追加しました。

GL.Enable(All.DepthTest);
GL.DepthFunc(All.Greater);
GL.DepthMask(true);

// Shape A
GL.DrawArrays (All.TriangleStrip, 0, 4); 

// Shape B (should be behind Shape A)
GL.Translate (.5f,.5f,.5f);
GL.DrawArrays (All.TriangleStrip, 0, 4); 

// Shape C (should be in front of Shape A)
GL.Translate (-1f,-1f,-1f);
GL.DrawArrays (All.TriangleStrip, 0, 4);

形状Bと形状Cの両方が形状Aの前に描画されます。「GL.DepthFunc(All.Never)」でも同じことが起こります。デプスバッファは完全に無視されます。また、次のコードを使用して、深度バッファーを手動で作成しようとしました(MonoTouch / OpenTK "iPhoneOSGameView"に依存して作成するのではなく)。

protected override void CreateFrameBuffer()
{
    base.CreateFrameBuffer();    
    uint depthbuffer=0;
    GL.Oes.GenRenderbuffers (1, ref depthbuffer);
    GL.Oes.BindFramebuffer (All.RenderbufferOes, depthbuffer);
    GL.Oes.RenderbufferStorage (All.RenderbufferOes, All.DepthComponent16Oes, (int) 768, (int) 1024);
    GL.Oes.FramebufferRenderbuffer (All.FramebufferOes, All.DepthAttachmentOes, All.RenderbufferOes, depthbuffer);
}

それはまだ機能していません。デプスバッファを機能させる方法を知っていますか?私は何かが足りないのですか?

4

2 に答える 2

2

投稿されたNeHe-Lesson holmes のおかげで、解決策が見つかりました。「OpenTK.Graphics.ES11.GL.Oes」のメソッドではなく、「OpenTK.Graphics.ES20.GL」のメソッドを使用して深度バッファを作成します。バッファーが作成されたら、残りのプログラムで "OpenTK.Graphics.ES11" の標準 OpenGL 1.1 メソッドを使用できます。コードは次のとおりです。

OpenTK.Graphics.ES20.GL.GenRenderbuffers (1,ref depthRenderBuffer);
OpenTK.Graphics.ES20.GL.BindRenderbuffer (OpenTK.Graphics.ES20.All.Renderbuffer, depthRenderBuffer);
OpenTK.Graphics.ES20.GL.RenderbufferStorage (OpenTK.Graphics.ES20.All.Renderbuffer, OpenTK.Graphics.ES20.All.DepthComponent16, Size.Width, Size.Height);
OpenTK.Graphics.ES20.GL.FramebufferRenderbuffer (OpenTK.Graphics.ES20.All.Framebuffer, OpenTK.Graphics.ES20.All.DepthAttachment, OpenTK.Graphics.ES20.All.Renderbuffer, depthRenderBuffer);
于 2012-07-04T21:33:08.917 に答える
1

以下を試してください。

GL.ClearDepth(1.0f);    
GL.Enable(All.DepthTest);   
GL.DepthFunc( All.Lequal);  

また、レンダリングごとに深度をクリアすることを忘れないでください。

GL.Clear((int)(All.ColorBufferBit | All.DepthBufferBit));

学習中に、MonoTouch を使用した NeHe レッスンのコードを Github に投稿しました。 これは深度テストが必要な最初のレッスンであり、さらに詳しい情報を提供します。

于 2012-07-03T16:24:17.910 に答える