2010-06-18 26 views
3

J'essaye de brouiller une texture de profondeur en floutant & en fusionnant les niveaux de mipmap dans un fragment shader.Rendre flou le buffer de profondeur dans OpenGL - comment accéder aux niveaux de mipmap dans un fragment shader?

J'ai deux objets de type "frambuffer":
1) Un tampon de couleur avec un objet de rendu de profondeur attaché.
2) Un tampon d'image z avec une texture de profondeur attachée. Une fois que j'ai rendu la scène à l'objet framebuffer de couleur, je blit alors à l'objet de tampon de profondeur, et peut rendre avec succès cela (la sortie est une texture de profondeur GL_LUMINANCE).

je peux accéder avec succès tous les niveaux de mipmap donné en le sélectionnant avant de tirer le tampon de profondeur, par exemple, je peux rendre le niveau de mipmap 3 comme suit:

// FBO setup - all buffer objects created successfully and are complete and the color 
// framebuffer has been rendered to (it has a depth renderbuffer attached), and no 
// OpenGL errors are issued: 
glBindFramebuffer(GL_READ_FRAMEBUFFER, _fbo_color); 
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, _fbo_z); 
glBlitFramebuffer(0,0,_w, _h, 0, 0, _w, _h, GL_DEPTH_BUFFER_BIT, GL_NEAREST); 
glGenerateMipmap(GL_TEXTURE_2D); 

glBindFramebuffer(GL_FRAMEBUFFER, 0); 

// This works: 
// Select mipmap level 3 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 3); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 3); 

draw_depth_texture_on_screen_aligned_quad(); 

// Reset mipmap 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1000); 

Comme alternative, je voudrais ajouter le paramètre bias à la fonction GLSL texture2D(), ou utiliser texture2DLod() et opérer avec un seul sampler de texture, mais chaque fois que je choisis un niveau supérieur à 0, le mipmap n'a pas été généré:

// fragment shader (Both texture2DLod and texture2D(sampler, tcoord, bias) 
// are behaving the same. 
uniform sampler2D zbuffer; 
uniform int mipmap_level; 

void main() 
{ 
    gl_FragColor = texture2DLod(zbuffer, gl_TexCoord[0].st, float(mipmap_level)); 
} 

Je ne suis pas sûr de savoir comment fonctionne le mipmapping wi Le glBlitFramebuffer(), mais ma question est quelle est la bonne façon d'installer le programme de sorte que les appels faits à texture2D/texture2DLod donnent les résultats attendus?

Merci, Dennis

+0

Quels sont les résultats attendus? Pourquoi pensez-vous que le mipmap n'a pas été généré? Publiez quelques captures d'écran en tant qu'exemples. –

+0

Matias - Essentiellement, j'essaie d'effectuer le même type de chose que dans l'OpenGL Superbible (4ème éd.) De la bloom/afterglow, mais dans un but légèrement différent. Je pourrais poster une image de mon écran, mais je devrais mettre en place un hébergement pour ça, et comme je suis fainéant, je ne veux pas faire ça. Si vous avez un meilleur moyen que ce que j'ai décrit dans ma réponse, s'il vous plaît faites le moi savoir. Merci! –

Répondre

3

Ok - je pense que je l'ai ... Mon tampon de profondeur n'a pas les niveaux mipmap générés. J'utilise la multi-texturation, et pendant le rendu, j'active l'unité de texture 0 pour la texture framebuffer et l'unité de texture 1 pour la texture du buffer de profondeur. Quand j'activer/lier les textures, je l'appelle glGenerateMipmap (GL_TEXTURE_2D) comme suit:

glActiveTextureARB(GL_TEXTURE0_ARB); 
glBindTexture(GL_TEXTURE_2D, _color_texture); 
glGenerateMipmap(GL_TEXTURE_2D); 

glActiveTextureARB(GL_TEXTURE1_ARB); 
glBindTexture(GL_TEXTURE_2D, _zbuffer_texture); 
glGenerateMipmap(GL_TEXTURE_2D); 

Lorsque cela est fait, ce qui augmente le biais dans la Texture2D (sampler, coord, biais) donne des fragments du niveau mipmap comme prévu.

+0

Donc le bug ne créait pas les mipmaps dans les textures correctes? –

+0

Oui - Je n'ai pas généré les mipmaps sur les textures. Encore merci pour votre contribution! –