Interpolation der Texturkoordinaten in OpenGL



  • Hiho,

    ich bin grad über folgendene Problematik gestolpert:

    http://www.r3.nu/~cass/qcoord/

    Der Artikel da ist leider ziemlich knapp. Ich würde gerne einmal die gesamte mathematische Herleitung nachvollziehen. Dazu muss ich aber wissen, wie genau OpenGL die Interpolation da durchführt. Dann würde ich das selber mal rückrechnen. In dem Artikel steht das leider nicht und im RedBook hab ich auch nichts gefunden. Hat da wer Quellen oder weiß wie die Interpolation genau abläuft?

    MfG Pellaeon



  • Perspektivische Interpolation von Texturkoordinaten (s,t,q):
    s/q t/q 1/q
    Daraus wird pro Pixel:
    s'= (s/q)/(1/q)
    t'= (t/q)/(1/q)
    Das gleiche passiert auch bei "2D" Texturkoordinaten, nur dass "q" dann die Z-Koordinate des Vertex ist (und 1/z entspricht der perspektivischen Transformation).

    Vgl zb Mesa-7.1 (src/mesa/swrast/s_triangle.c):

    GLdouble invQ = (1.0 / tex_coord[2]);
    GLfloat s_tmp = (GLfloat) (tex_coord[0] * invQ);
    GLfloat t_tmp = (GLfloat) (tex_coord[1] * invQ);
    GLint s = IFLOOR(s_tmp) & info->smask;
    GLint t = IFLOOR(t_tmp) & info->tmask;
    GLint pos = (t << info->twidth_log2) + s;
    const GLchan *tex00 = info->texture + COMP * pos;
    


  • Hiho,

    erstmal danke für deine Antwort! So ganz ist das aber noch nicht was ich wollte. Mir gings mal um den gesamten Ablauf.

    Als zuerst hab ich meine Texturkoordinaten (s,t,r,q). Ob 1D,2D oder 3D ist ja erstmal geal, Was nicht genutzt wird, wird 0 gesetzt außer q, das ist standardmäßig 1.

    So als nächstes werden die Texturkoordinaten mit der Texturmatrix multipliziert, Vertex entsprechend mit Modelview. Vertex ist jetzt im Projection Space. Texturkoordinaten haben sich im Normalfall (Texturmatrix ist Identity) nicht geändert.
    So nun werden ja noch irgendwie die Texturkoordinaten über das Dreiecke interpoliert. Das ist der Punkt, wo ich noch nicht so recht weiß, wie genau das gemacht wird.
    Und dann irgendwann wird ja der 4D-Vektor noch durch q gerechnet. Oder kommt das mit dem q vorher? Aber ich dachte erst danach, weil im Pixelshader kann man ja unterscheiden, ob texture2D oder tetxure2DProj, und da sind die ja schon interpoliert.

    Ich versteh nämlich noch nicht recht, warum dieser perspektifische Effekt zustande kommt. Der Interpolationsvektor müsste doch konstant sein? Aber wenn ich mir das anschaue, ist der unten ja größer, also in y ändert sich das t schneller und nach oben hin wirds enger, also das t ändert sich langsamer.

    Ich hoffe das ist jetzt halbwegs verständlich 🙂 ich wollt nämlich schauen, ob es geht das in y keine Verzerrung ist, also die INterpoolation wirklich linear stattfindet und nur in x die Anpassung kommt.



  • nun werden ja noch irgendwie die Texturkoordinaten über das Dreiecke interpoliert

    Das ist genau der Teil der oben steht.

    Nach der Projektion macht es ja keinen Unterschied, ob die Textur perspektivisch auf ein Polygon projeziert wurde das parallel zur Projektionsebene steht oder ob die Textur "parallel" auf einem perspektivischem Polygon liegt.

    Nehmen wir der Einfachheit halber den ersten Fall an:
    Die 2D-Texturkoordinaten verlaufen im 3D-Raum parallel zum Polygon.
    Nach der Projektion auf den zweidimensionalen Bildschirm ist das nicht mehr gegeben.
    Die perspektivische Transformation (Division durch Z; vgl. Strahlensatz) muss, damit wieder lineare Interpolation moeglich ist, auch auf die Texturkoordinaten (bzw alle Vertexattribute) ausgefuehrt werden:

    u'= u/z
    v'= v/z
    z'= 1/z
    

    Diese Koordinaten werden nun (linear) entlang der Polygonkanten interpoliert und fuer jeden Pixel in den Texturraum zuruecktransformiert:

    u''= u' / z'
    v''= v' / z'
    

Anmelden zum Antworten