2012-07-01 2 views
1

Je n'arrive pas à faire fonctionner le tampon de profondeur en utilisant MonoTouch sur iOS 5. J'utilise le modèle standard "Application OpenGL" MonoTouch et j'ai ajouté ce code pour tester le tampon de profondeur (OpenGL ES 1.1):Le tampon de profondeur OpenGL ES 1.1 ne fonctionne pas avec MonoTouch sur iOS 5

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

Les deux formes B et C sont tirés en face de forme A. La même chose se produit même avec "GL.DepthFunc (All.Never)". Le tampon de profondeur est complètement ignoré. J'ai aussi essayé de créer manuellement un tampon de profondeur (au lieu de compter sur la MonoTouch/OpenTK « iPhoneOSGameView » pour créer un pour moi) en utilisant ce code:

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

Il ne fonctionne toujours pas. Avez-vous une idée de la façon dont je peux faire fonctionner le tampon de profondeur? Est-ce que je manque quelque chose?

Répondre

2

Grâce aux holmes NeHe-Lesson affichés, j'ai trouvé une solution: j'utilise les méthodes dans "OpenTK.Graphics.ES20.GL" au lieu de celles dans "OpenTK.Graphics.ES11.GL.Oes" pour créer le buffer de profondeur . Une fois le tampon créé, je peux utiliser les méthodes standard OpenGL 1.1 dans "OpenTK.Graphics.ES11" pour le reste de mon programme. Voici le code:

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

Essayez les solutions suivantes.

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

N'oubliez pas d'effacer la profondeur de chaque rendu. J'ai posté mon code pour les leçons de NeHe en utilisant MonoTouch sur Github pendant que j'apprenais. This est la première leçon qui nécessite des tests de profondeur et mon donner plus d'informations.

+0

Merci pour votre lien! C'était très utile. Je l'ai eu pour travailler en utilisant les méthodes dans "OpenTK.Graphics.ES20.GL" au lieu de ceux dans "OpenTK.Graphics.ES11.GL.Oes" pour créer le tampon de profondeur. Une fois le tampon créé, je peux utiliser les méthodes standard OpenGL 1.1 dans "OpenTK.Graphics.ES11" pour le reste de mon programme. – Heiko

Questions connexes