El búfer de profundidad de OpenGL ES 1.1 no funciona con MonoTouch en iOS 5

No puedo hacer que el búfer de profundidad funcione usando MonoTouch en iOS 5. Estoy usando la plantilla estándar de "Aplicación OpenGL" de MonoTouch y agregué este código para probar el búfer de profundidad (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);

Tanto la forma B como la C se dibujan delante de la forma A. Lo mismo sucede incluso con "GL.DepthFunc(All.Never)". El búfer de profundidad se ignora por completo. También intenté crear manualmente un búfer de profundidad (en lugar de confiar en MonoTouch/OpenTK "iPhoneOSGameView" para crear uno para mí) usando este código:

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);
}

Todavía no funciona. ¿Tiene alguna idea de cómo puedo hacer que funcione el búfer de profundidad? ¿Me estoy perdiendo de algo?

preguntado el 01 de julio de 12 a las 19:07

2 Respuestas

Gracias a la solución NeHe-Lección Holmes publicó, encontré una solución: utilizo los métodos en "OpenTK.Graphics.ES20.GL" en lugar de los de "OpenTK.Graphics.ES11.GL.Oes" para crear el búfer de profundidad. Después de crear el búfer, puedo usar los métodos estándar de OpenGL 1.1 en "OpenTK.Graphics.ES11" para el resto de mi programa. Aquí está el código:

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);

Respondido 04 Jul 12, 22:07

Intente lo siguiente.

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

Además, no olvide borrar la profundidad en cada renderizado.

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

Publiqué mi código para las lecciones de NeHe usando MonoTouch en Github mientras estaba aprendiendo. Esta es la primera lección que requiere pruebas profundas y le daré más información.

Respondido 03 Jul 12, 17:07

¡Gracias por tu enlace! Fue muy útil. Conseguí que funcionara utilizando los métodos de "OpenTK.Graphics.ES20.GL" en lugar de los de "OpenTK.Graphics.ES11.GL.Oes" para crear el búfer de profundidad. Después de crear el búfer, puedo usar los métodos estándar de OpenGL 1.1 en "OpenTK.Graphics.ES11" para el resto de mi programa. - Heiko

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.