Frage

Ich habe versucht, ein GL_QUAD (das als Trapez geformt ist) mit einer quadratischen Textur zu rendern. Ich möchte versuchen, OpenGL nur zu verwenden, um dies zu erreichen. Im Moment wird die Textur stark verzerrt und es ist wirklich nervig.

Normalerweise würde ich die Textur laden, um eine Homographie zu berechnen, aber das bedeutet viel Arbeit und eine zusätzliche lineare Programmierbibliothek / direkte lineare Transformationsfunktion. Ich habe den Eindruck, dass OpenGL diesen Prozess für mich vereinfachen kann.

Ich habe mich im Internet umgesehen und "Perspective gesehen -Korrekte Texturierung, Q-Koordinaten und GLSL " und "Schräg / Scher-Textur-Mapping in OpenGL" .

Diese scheinen alle davon auszugehen, dass Sie eine Art Homografieberechnung durchführen oder einige Teile von OpenGL verwenden, von denen ich nichts weiß ... Ratschläge?

Update:

Ich habe "Navigieren in statischen Umgebungen mit Image-" gelesen. Vereinfachung und Morphing des Weltraums " [ PDF ] - Seite 9 Anhang A.

Es sieht so aus, als würden sie die perspektivische Korrektur deaktivieren, indem sie die Texturkoordinate (s, t, r, q) mit dem Scheitelpunkt der z-Komponente des Weltraums eines Modells multiplizieren.

also für eine gegebene Texturkoordinate (s, r, t, q) für ein Quad, das als Trapez geformt ist, wobei die 4 Komponenten sind:

(0.0f, 0.0f, 0.0f, 1.0f),
(0.0f, 1.0f, 0.0f, 1.0f),
(1.0f, 1.0f, 0.0f, 1.0f),
(1.0f, 0.0f, 0.0f, 1.0f) 

Dies ist so einfach wie glTexCoord4f (s vert.z, r vert.z, t, q * vert.z)? Oder fehlt mir ein Schritt? wie mit dem GL_TEXTURE glMatrixMode herumspielen?

Update Nr. 2:

Das hat den Trick gemacht! Denken Sie daran, Leute, dieses Problem ist überall im Internet und es gab keine einfachen Antworten. Am häufigsten wurde die Textur direkt mit einer Homographie zwischen der ursprünglichen Form und der transformierten Form neu berechnet ... auch bekannt als viel lineare Algebra und eine externe BLAS-Lib-Abhängigkeit.

War es hilfreich?

Lösung

Hier finden Sie eine gute Erklärung des Problems und der Lösung.

http://www.xyzw.us/~cass/qcoord/

Teilweise kopiert und vom obigen Link angepasst, erstellt von Cass

Einer der interessantesten Aspekte der Texturabbildung ist der Raum, in dem Texturkoordinaten leben. Die meisten von uns betrachten den Texturraum gerne als eine einfache affine 2D-Ebene. In den meisten Fällen ist dies durchaus akzeptabel und sehr intuitiv, aber manchmal wird es problematisch.

Angenommen, Sie haben ein Quad, das in seinen Raumkoordinaten trapezförmig, in seinen Texturkoordinaten jedoch quadratisch ist.

OpenGL teilt das Quad in Dreiecke und berechnet die Steigungen der Texturkoordinaten (ds / dx, ds / dy, dt / dx, dt / dy) und verwendet diese, um die Texturkoordinate über das Innere des Polygons zu interpolieren. Für das untere linke Dreieck ist dx= 1 und ds= 1, für das obere rechte Dreieck jedoch dx <1, während ds= 1. Dies macht ds / dx für das obere rechte Dreieck größer als ds / dx für das untere. Dies erzeugt ein unangenehmes Bild, wenn die Textur zugeordnet wird.

Der Texturraum ist nicht einfach eine affine 2D-Ebene, obwohl wir im Allgemeinen die Standardeinstellungen r= 0 und q= 1 in Ruhe lassen. Es ist wirklich ein voller Projektionsraum (P3)! Dies ist gut, da wir die Texturkoordinaten für die oberen Eckpunkte nicht als (s, t) -Koordinaten von (0, 1) und (1, 1) angeben, sondern als (s, t, r, q) -Koordinaten angeben können von (0, Breite, 0, Breite) und (Breite, Breite, 0, Breite)! Diese Koordinaten entsprechen der gleichen Stelle im Texturbild, aber schauen Sie sich an, was mit ds / dx passiert ist - es ist jetzt für beide Dreiecke gleich !! Sie haben beide das gleiche dq / dx und dq / dy.

Beachten Sie, dass es sich immer noch in der Ebene z= 0 befindet. Bei Verwendung dieser Technik mit einer perspektivischen Kameraprojektion kann es aufgrund der dadurch erzeugten "falschen Tiefenwahrnehmung" ziemlich verwirrend werden. Dennoch kann es besser sein, als nur (s, t) zu verwenden. Das müssen Sie selbst entscheiden.

Andere Tipps

Ich würde vermuten, dass die meisten Leute, die eine rechteckige Textur auf ein Trapez passen möchten, an eines von zwei Ergebnissen denken:

  1. perspektivische Projektion: Das Trapez sieht aus wie ein Rechteck aus einem schrägen Winkel.
  2. "dehnbare" Transformation: Das Trapez sieht aus wie ein rechteckiges Stück Gummi, das gedehnt / in Form geschrumpft wurde.

    Die meisten Lösungen hier auf SO fallen in die erste Gruppe, während ich mich kürzlich in der zweiten befand.

    Der einfachste Weg, um Effekt 2 zu erzielen, bestand darin, das Trapez in ein Rechteck und ein rechtwinkliges Dreieck zu teilen.In meinem Fall war das Trapez regelmäßig, daher lösten ein Quad und zwei Dreiecke das Problem.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top