En utilisant un tampon de profondeur dans OpenGL2.0 iphone
-
27-09-2019 - |
Question
I suivie d'un tutoriel en utilisant un tampon de profondeur dans OpenGL ES 1.1. Mais j'utilise OpenGL2.0. Les résultats de code mis en œuvre une erreur: faire 8cd6 Failed complet d'objets framebuffer. Voir ci-dessous le code mis en œuvre:
(void)createFramebuffer
{
if (context && !defaultFramebuffer)
{
[EAGLContext setCurrentContext:context];
// Create default framebuffer object.
glGenFramebuffers(1, &defaultFramebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer);
// Create color render buffer and allocate backing store.
glGenRenderbuffers(1, &colorRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);
// Create depth render buffer
glGenRenderbuffers(1, &depthRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer);
[context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer *)self.layer];
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &framebufferWidth);
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &framebufferHeight);
glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, framebufferWidth, framebufferHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRenderbuffer);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderbuffer);
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
NSLog(@"Failed to make complete framebuffer object %x", glCheckFramebufferStatus(GL_FRAMEBUFFER));
}
}
Cordialement Niclas
La solution
Le problème est que vous deux fois le stockage de liaison à votre profondeur renderbuffer, et jamais à votre renderbuffer couleur. Le message de -renderbufferStorage:fromDrawable:
à votre EAGLContext lie un stockage à la renderbuffer actuellement lié, ce qui dans votre cas est la profondeur renderbuffer. À la suite, vous stockage lier à nouveau en utilisant l'appel glRenderbufferStorage
.
La solution consiste à lier la couleur renderbuffer avant d'envoyer le message de stockage, de sorte que le stockage se limite à cela. C'est, insérer une glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);
ligne directement au-dessus du message, après avoir créé votre profondeur renderbuffer. Il faut travailler, je suis en mesure de reproduire votre erreur et résoudre par la suite de cette façon.
NB. Assurez-vous toujours que les tampons corrects sont liés. Vous pouvez vérifier à l'aide glGetIntegerv()
pour la liaison et glGetRenderbufferParameteriv()
pour les paramètres supplémentaires.