2009-05-20 9 views
0

Ich versuche, den Bildschirm auf eine Textur mit einer niedrigeren Auflösung als der Bildschirm selbst (um auf den Bildschirm zu rendern und erstellen Sie eine Unschärfe/Bloom-Effekt), und es zu erfassen funktioniert nicht ganz gut. Ich verstehe, dass Mipmaps verwendet werden können, um dies zu tun, aber ich kann einfach nicht die richtige Reihenfolge der Befehle erhalten.OpenGL - Kopieren Textur von Bildschirm kleiner als dieser Bildschirm

Mein aktueller Code:

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 

Antwort

2

Sie können nicht erfassen und downfilter in einem Rutsch. Sie müssen zuerst den gesamten Bildschirm auf eine größere Textur aufzeichnen, dann sollten Mipmaps erstellt werden, wenn Mipmaps automatisch erstellt werden, dann können Sie einen mit dieser Textur erneut rendern, um sicherzustellen, dass Sie den Mipmap-Level entsprechend anpassen.

Das sieht jedoch hässlich aus, da die automatische Mipmapgenerierung normalerweise einen Boxfilter verwendet.

Ich würde stattdessen einige FBOs (Frame Buffer Objects) und GLSL-Shader einrichten. Das gibt Ihnen bessere Kontrolle über alle Stufen:

  • das Originalbild in einer
  • Textur erstellen
  • einigen schönen Gaußsche Tiefpass anwenden Filterung
  • Mischung der Filterung mit dem Originalbild zu dem Rahmenpuffer