2012-06-01 1 views
1

Je travaille avec l'architecture suivante:multisamplés rendu à la texture

  • OpenGL ES 2 sur iOS
  • Deux contextes EAGL avec le même ShareGroup
  • Deux fils (serveur, client = thread principal); le serveur restitue les textures, le client affiche les textures en utilisant des quads texturés simples.

Des détails supplémentaires au fil du serveur (code de travail)

Une fbo est créée lors de l'initialisation:

void init(void) { 
    glGenFramebuffer(1, &fbo); 
} 

La boucle de rendu du serveur ressemble à peu près comme ceci:

GLuint loop(void) { 
    glBindFrameBuffer(GL_FRAMEBUFFER, fbo); 
    glViewport(0,0,width,height); 

    GLuint tex; 
    glGenTextures(1, &tex); 
    glBindTexture(GL_TEXTURE_2D, tex); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); 
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0); 

    // Framebuffer completeness check omitted 

    glClear(GL_COLOR_BUFFER_BIT); 

    // actual drawing code omitted 

    // the drawing code bound other textures, so.. 
    glBindTexture(GL_TEXTURE_2D, tex); 
    glGenerateMipmap(GL_TEXTURE_2D); 

    glBindTexture(GL_TEXTURE_2D, GL_NONE); 
    glFlush(); 

    return tex; 
} 

Tout cela fonctionne très bien jusqu'à présent.

Nouveau (poussette) Code

Maintenant, je veux ajouter Multisampling au fil du serveur, en utilisant l'extension GL_APPLE_framebuffer_multisample et a modifié le code d'initialisation comme ceci:

void init(void) { 
    glGenFramebuffer(1, &resolve_fbo); 
    glGenFramebuffers(1, &sample_fbo); 
    glBindFramebuffer(GL_FRAMEBUFFER, sample_fbo); 
    glGenRenderbuffers(1, &sample_colorRenderbuffer); 
    glBindRenderbuffer(GL_RENDERBUFFER, sample_colorRenderbuffer); 
    glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER, 4, GL_RGBA8_OES, width, height); 
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, sample_colorRenderbuffer); 

    // Framebuffer completeness check (sample_fbo) omitted 

    glBindRenderbuffer(GL_RENDERBUFFER, GL_NONE); 
    glBindFramebuffer(GL_FRAMEBUFFER, GL_NONE); 
} 

La boucle principale a modifié à:

GLuint loop(void) { 
    glBindFrameBuffer(GL_FRAMEBUFFER, sample_fbo); 
    glViewport(0,0,width,height); 

    GLuint tex; 
    glGenTextures(1, &tex); 
    glBindTexture(GL_TEXTURE_2D, tex); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); 

    glClear(GL_COLOR_BUFFER_BIT); 

    // actual drawing code omitted 

    glBindFramebuffer(GL_FRAMEBUFFER, resolve_fbo); 
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0); 

    // Framebuffer completeness check (resolve_fbo) omitted 

    // resolve multisampling 
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER_APPLE, resolve_fbo); 
    glBindFramebuffer(GL_READ_FRAMEBUFFER_APPLE, sample_fbo); 
    glResolveMultisampleFramebufferAPPLE(); 

    // the drawing code bound other textures, so.. 
    glBindTexture(GL_TEXTURE_2D, tex); 
    glGenerateMipmap(GL_TEXTURE_2D); 

    glBindTexture(GL_TEXTURE_2D, GL_NONE); 
    glFlush(); 

    return tex; 
} 

Ce que je vois maintenant, c'est qu'une texture contient des données de mul tiple loop() appels, mélangés ensemble. Je suppose que je suis soit manquant un «unbind» d'un certain type, ou probablement un glFinish() appel (J'ai déjà eu un tel problème à un moment différent, j'ai mis les données de texture avec glTexImage2D() et l'ai utilisé juste après - cela a nécessité un appel glFinish() forcer la texture à mettre à jour).

Cependant l'insertion d'un glFinish() après le code de dessin n'a pas changé quoi que ce soit ici ..

Répondre

1

Oh Nevermind, une telle erreur stupide. J'ai omis le détail que la méthode loop() contient en réalité une boucle for et rend plusieurs textures, l'erreur était que je liais l'exemple fbo seulement avant cette boucle, donc après la première exécution la fbo de résolution était liée

Déplacer la liaison fbo à l'intérieur de la boucle a résolu le problème.

En tout cas, merci @ tous les lecteurs et désolé de perdre votre temps :)