OpenGL versucht auch weiterhin mit GL_NEAREST (GL_TEXTURE_2D) zu verwischen

8

Ein Bild sagt tausend Worte, also was ist mit zwei? Ich habe diese Map Art:

Um dies tatsächlich als Karte zu benutzen, skaliere ich diese Textur 6 mal. Dies ging jedoch nicht wie erwartet:

Der gesamte OpenGL-Code ist in meiner homebrew 2D-OpenGL-Rendering-Bibliothek, und da OpenGL eine Zustandsmaschine ist, ist es schwierig, den gesamten Renderprozess wirklich zu dokumentieren. Aber hier ist +/- was ich tue (der Code ist Python):

%Vor%

Dieser "Unschärfe" -Fehler tritt jedoch nicht auf, wenn ich GL_TEXTURE_RECTANGLE_ARB verwende. Ich möchte auch GL_TEXTURE_2D verwenden können, also kann jemand bitte darauf hinweisen, wie man das verhindert?

    
orlp 30.12.2011, 16:57
quelle

2 Antworten

7

Wenn Sie Zweifel haben, ersetzen Sie Ihre Textur durch gleichgroßes schwarz-weißes Schachbrettmuster (schwarz / weiß 1px). Es wird Ihnen ein gutes Gefühl dafür geben, was läuft - wird es einheitlich grau (Verschiebung ist falsch) oder wird es Wellen haben (Skalierung ist falsch).

Stellen Sie sicher, dass keine MIP-Maps automatisch generiert und verwendet werden.

Im Allgemeinen brauchen Sie keine spezielle Verschiebung, Texel passen Pixel mit richtig eingerichtetem GlOrtho zusammen.

Ein weiteres wichtiges Thema - Verwenden Sie PowerOfTwo-Texturen, da ältere GPUs verschiedene Schemata verwenden können, um NPOT-Texturen zu unterstützen (Skalierung oder Auffüllung für den Benutzer transparent), die genau diese Art von Unschärfe bewirken könnten.

Um manuell mit NPOT-Texturen arbeiten zu können, müssen Sie diese mit klaren Pixeln bis zur nächsten POT-Größe füllen und Ihre UV-Werte glTextCoord2f(u,v) um den Faktor npotSize / potSize skalieren. Beachten Sie, dass dies nicht mit Tiling kompatibel ist, aber nach Ihrer Kunst zu urteilen, brauchen Sie es nicht.

    
Kromster 30.12.2011, 18:15
quelle
4
%Vor%

Leider ist das nicht genug, da Sie auch die Textur skalieren müssen. Für eine unskalierte, nicht übersetzte Texturmatrix, um ein bestimmtes Pixel i aus einer Textur mit Dimension N zu adressieren, müssen Sie die Formel

anwenden %Vor%

Sie können daraus Ihre Skalierung und Übersetzung ableiten - oder die Texturkoordinaten direkt bestimmen.

BEARBEITEN wegen Kommentar.

Okay, nehmen wir an, dass Ihre Textur 300 Pixel breit ist und Sie genau die Pixel 20 bis 250 adressieren möchten, dann wären die Texturkoordinaten für eine Identitäts-Texturmatrix

%Vor%

und

%Vor%

Aber Sie könnten auch eine Transformation durch die Texturmatrix anwenden. Sie möchten die Pixel 0 ... 299 (für 300 Pixel Breite der Index von 0 bis 300-1 = 299) auf 0 ... 1 abbilden. Also lassen Sie uns diese Zahlen einfügen:

%Vor%

Sie müssen also den Bereich 0 ... 1 um 0.9967 verkleinern und um 0.0017 in der Breite versetzen. Die gleiche Berechnung gilt für die Höhe ← → t Koordinaten. Denken Sie daran, dass die Reihenfolge der Transformationen wichtig ist. Sie müssen zuerst skalieren und dann übersetzen, wenn Sie die Transformation durchführen, also wird in den Matrixmultiplikationen die Übersetzung zuerst multipliziert:

%Vor%

Wenn Sie anstelle des Bereichs 0 ... 1 Pixel verwenden möchten, unterteilen Sie die Skala weiter durch die Texturbreite.

EIN GROSSES ABER:

OpenGL-3 hat die gesamten Matrixmanipulationsfunktionen vollständig verworfen und erwartet, dass Sie es bereit für die Verwendung von Matrizen und Shadern bereitstellen. Und für OpenGL-Fragment-Shader gibt es eine nette Funktion texelFetch , mit der Sie Texturpixel mit absoluten Koordinaten direkt abrufen können. Das würde viel einfacher machen!

    
datenwolf 30.12.2011 17:59
quelle

Tags und Links