2009-05-20 20 views
0

J'essaye de capturer l'écran à une texture avec une résolution inférieure à celle de l'écran lui-même (pour revenir à l'écran et créer un effet flou/bloom) ne fonctionne pas très bien. Je comprends que mipmaps peut être utilisé pour faire cela, mais je ne peux pas obtenir la bonne séquence de commandes pour fonctionner.OpenGL - Copie de texture à partir d'un écran plus petit que cet écran

Mon code actuel:

width=1024; 
height=1024; 

glGenTextures(1, &texture); 

glEnable(GL_TEXTURE_2D); 
glBindTexture(GL_TEXTURE_2D, texture); 

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glEnable (GL_BLEND); 
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); 

glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, width, height, 0); 

// code for rendering the screen back on goes here 

Répondre

2

Vous ne pouvez pas capturer et downfilter en une seule fois. Vous devez d'abord capturer l'intégralité de l'écran à une texture plus grande, puis mipmaps doit être créé si les mipmaps auto-créer sont activés, puis vous pouvez en restituer une à l'aide de cette texture, assurez-vous d'ajuster le niveau mipmap correctement.

Cependant, cela semblera laid, car la mipmapgeneration automatique utilise généralement un filtre de boîte. Ce que je ferais, c'est de mettre en place des FBO (Frame Buffer Objects) et des shaders GLSL à la place. Cela vous donne un contrôle plus précis sur toutes les étapes:

  • créer l'image d'origine dans une texture
  • appliquer une belle gaussienne filtrage passe-bas
  • mélange le filtrage à l'image d'origine dans la mémoire tampon de trame