OpenGL Texture Ebene kontrollieren



  • Stimmt, das war's MipMapping
    Ich hab das zwar jetzt erst mal mit "gluBuild2DMipMapping" oder so aber es funktioniert. Sieht schon gleich viel schöner aus 😃



  • Ich hab das ja jetzt mit gluBuild2DMipmaps gemacht, aber ich würde das gerne ohne Hilfe zusätzlicher, externer Bibliotheken machen.
    Wenn man das mit glTexImage2D macht muss man ja auch das 'level' angeben aber werden die Bilddaten (const void* data) dann automatisch um die hälfte skalliert oder muss man das auch selbst machen?



  • Musst Du selbst machen.
    gluBuild2DMipmaps stellt weiterhin sicher, dass die Texturgroesse eine Zweierpotenz ist und Mip-Level 0 kleinergleich der maximal moeglichen Texturgroesse ist.
    Ein geeigneteres Filter kann je nach Anwendungsfall erheblich visuelle Verbesserungen erzielen.



  • So ich hab jetzt eine recht stabile und schöne Funktion die im Grunde fast alles genau so macht wie die gluBuild2DMipmaps Funktion 😃

    Allerdings sehen die Texturen mit gluBuild2DMipmaps erstellt immer noch etwas schöner aus, jeden Falls manche.
    Kann es sein das diese Funktion kleine Bilder Grundsätzlich etwas größer abspeichert? Mit meiner Funktion erstellt sehen die nicht ganz so 'flüssig' aus wenn ich GL_LINEAR_MIPMAP_LINEAR verwende als mit gluBuild2DMipmaps 😞
    Was macht die Funk. noch alles?



  • Kann es sein das diese Funktion kleine Bilder Grundsätzlich etwas größer abspeichert?

    Wenn die Groesse der Textur keine Zweierpotenz ist, wird auf die naechst groesse skaliert.
    Fuer die jeweils kleinere Mipmap wird jeweils der Mittelwert aus 2x2 Pixeln gebildet.



  • 2x2 Pixeln?! Also ich hab einfach den Mittelwert der Aktuellen Pixel Position auf der Texture + die 4 direkt umliegenden Pixel genommen. Außer natürlich an den Rändern und Ecken. Das sieht jetzt im Prinzip schon so aus wie mit glu... jedenfals das Mipmapping, aber die Textur von nahem betrachtet (Level 0 Texture) sieht mit glu... erzeugt immer noch schöner aus 😞
    Aber eigentlich ist die erste Texture - also Level 0 im Mipmapping - eine Kopie der geladenen Daten.

    Hier habe ich ein Beispielbild hochgeladen um den Unterschied zu verdeutlichen:
    http://softpixelengine.sourceforge.net/other/Demonstration2.JPG


  • Mod

    LukasBanana schrieb:

    2x2 Pixeln?! Also ich hab einfach den Mittelwert der Aktuellen Pixel Position auf der Texture + die 4 direkt umliegenden Pixel genommen.

    +-+-+
    |1|2|
    +-+-+
    |3|4|
    +-+-+
    werden zu
    +-+
    |2|
    +-+

    du fasst also immer 2*2 pixel zu einem zusammen.
    das ist ne triviale scalierung "Boxfilter" genannt die akzeptable ergaebnisse liefert.



  • Skaliert man einen Mipmap-Level auf die naechst groessere Mipmap (eben doppelt so gross), beinhaltet jeder Texel genau 2x2 Texel der groesseren Map.
    Es ist also "plausibel" deren Mittelwert zu bilden.
    "Korrekt" waere eine Filterglocke die der Impulsantwort eines einzelnen Texels entspricht; geht hier aber zu weit.
    In der Praxis stellt man mehrere Filterfunktionen zur Verfuegung und laesst den Grafiker entscheiden, welche das beste Ergebnis liefert.



  • Das Thema ist zwar schon etwas älter, aber mal ne ganz kleine Frage:

    Kommt die OpenGL Funktion "glTexImage2D" wirklich mit allen Texture Größen klar (nit nur 2^n) auch für alle MipMap Levels?



  • Kommt "glTexImage2D" wirklich mit allen Texture Größen klar

    Nein. Siehe Dokumentation.
    Texturen mit beliebiger Groesse werden mit GL_TEXTURE_RECTANGLE_ARB separat behandelt (und unterliegen einigen Einschraenkungen).



  • Aber in Wikipedia steht dass OpenGL seit Version 2.0 auch mit Texturegrößen klar kommt die nicht die Normgrößen haben?!

    Texturen beliebiger Größe (nicht mehr 2n für Höhe und Breite)

    http://de.wikipedia.org/wiki/OpenGL



  • Kann es ja auch und ich schrieb auch schon wie das geht.



  • Die DGL-Sachen sind nicht die allerneuesten da. Thereotisch gehen auch NPOT-Texturen. Allerdings hatte mal ATI auf irgendeiner Treiberversion wieder was verhauen, weswegen es dann den guten Rat gab. trotzdem weiterhin 2^n zu nutzen. Auf meiner nVidia 6600 go zB hab ich keine Probleme mit beliebigen Texturgrößen.



  • Also so steht es in der Spec:

    The restriction of textures to power-of-two dimensions has been relaxed for
    all texture targets, so that non-power-of-two textures may be specified without
    generating errors. Non-power-of-two textures was promoted from the
    GL ARB texture non power of two extension

    "May", also optional oO


Anmelden zum Antworten