2016-06-28 8 views
0

Ich habe eine OpenGL-basierte GUI. Ich verwende Superauflösung, um verschiedene Skalen handhaben zu können. Anstatt die Bilder zu skalieren, werden sie verkleinert (es sei denn, jemand läuft mit einer Auflösung von 4000x4000 +).OpenGL Super Auflösung Probleme

Das Problem ist, OpenGL scheint nicht reibungslos zu skalieren. Ich habe Artefakte, als wäre die Skalierung der nächste Nachbar. (ZB die Textkanten sind blockartig, auch wenn sie nicht im Original) sind

Dies sind die Einstellungen, die ich verwende:

glBindTexture(GL_TEXTURE_2D, tex); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); 

Hier ist ein Beispiel der Artefakte, die Skalierung 2: 1 I glauben. Vielleicht ist es aber nicht genau wegen Fensterkanten und so.

enter image description here

Sie können den linken Rand sieht perfekt (es ist allerdings nicht ist), aber der rechte Rand hat in es seltsam bricht. Die ursprüngliche Grafik ist perfekt symmetrisch und keine Artefakte.

Ich habe versucht GL_NEAREST, GL_LINEAR. Kein Mipmapping so ...

Sicher OpenGL ist nicht so schlecht bei der Skalierung? Ich möchte etwas wie bi-kubische Skalierung oder etwas, das gute Ergebnisse erzielen wird.

Ich verwende OpenGL 1.1. Ich könnte möglicherweise Bilder vorskalieren, aber ich würde das jedes Mal tun müssen, wenn sich die Fenstergrößen ändern und in der CPU langsam sein könnten.

Ich habe gezackte Ränder auf einigen Bildern auch. Der springende Punkt der Super-Auflösung war, all das zu vermeiden;/

Gibt es einige Einstellungen, die ich vermisse?

+1

Superresolution ist etwas irreführend, da es sich um Downsampling handelt. Nichtsdestoweniger sollte man, wenn man vom nächsten zum linearen Wert wechselt, den Unterschied bei kleiner Skalierung sehen, z. B. um 1/1,2 des Originals. 'GL_NEAREST' ist sicher die nächste Nachbarinterpolation. – mainactual

Antwort

0

Mit dem Code, den Sie zur Verfügung gestellt haben, werde ich raten, was das Problem sein könnte.

Versuchen Sie, Ihr Bild zu laden oder mindestens den Speicher vor zuweisen Sie diese Textur Parameter mit glParameteri. Und auch, setzen GL_TEXTURE_MIN_FILTER zu GL_LINEAR


Vielleicht haben Sie Supersampling (SSAA) gemeint, die Verwendung mindestens 2 Mal die ursprüngliche Auflösung und Downsampling dass ein weicheres Bild zu bekommen?

0

Es ist aus dem Bild zu sehen, dass es Linear-Filterung verwendet (bilinear) Versuchen Anisotrope Filterung:

glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &aniso); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, aniso); 

anisotrope Filterung auf verschiedenen Ebenen angewendet werden kann, dieser Code wird es auf dem maximalen Niveau gelten Sie können eine Nummer weniger als aniso verwenden, wenn Sie möchten. Dies sind extention Makros, wenn Sie nicht über die Erweiterung defenitions haben, sie sind dies:

#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE 
#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF 
3

Zuerst haben Signaltheorie zu verstehen, nämlich die Nyquist Theorem (die Wikipedia-Seite ist zu spezifisch, wenn im Gespräch Signale in die " Zeit "Domäne; die Prinzipien sind universell für alle Arten von diskret abgetasteten Signalen, einschließlich Bildern).Beim Downsampling müssen Sie immer eine lowpass anti aliasing filter anwenden, die alle Frequenzkomponenten oberhalb der halben Abtastfrequenz abschneidet, um die Erzeugung von Aliasing-Artefakten zu vermeiden. Ohne Filterung erzeugt selbst ein linearer Downsampler Artefakte. Die Echtzeitgrafik zur Implementierung eines Tiefpassfilters für Texturen ist mipmaps. Jeder Mipmap-Level schneidet genau um die Hälfte der Frequenz des nächsthöheren Levels ab.

Sie haben nun zwei Möglichkeiten:

  • Implement Mipmapping
  • ein Downsampling-Fragment Implementieren Shader

Natürlich die vernünftige Sache zu tun wäre, nicht in einer überschüssigen Auflösung in der zu machen erster Platz, aber rendern Sie Ihre GUIs bei genau die Zielauflösung.