Ich benutze OpenGL dazu ein Bild hardwarebeschleunigt anzuzeigen. Das Ganze in 2D (glortho). Dazu render ich einfach einen Quad un setzte das Bild als Textur drauf. Da die Bilder im Allgemeinen keine Größe von 2^n haben, kann ich nicht einfach glTexImage2D nehmen. Jetzt habe ich einfach, wie im Textur-Tutorial erwähnt wurde, gluBuild2DMipmaps benutzt.
Das Problem ist jetzt, dass es recht lange dauert bis der Befehl gluBuild2DMipmaps ausgeführt wird. Ich bin zwar Anfänger, aber ich denke mal das liegt am Mipmapping oder? Gibt es irgendeine Alternative mit der ich Texturen laden kann, die kein 2^n Größe haben? Großartige Filter brauch ich nicht. Benutze eh GL_NEAREST.
Oder gibt es vielleicht noch eine ganz andere Möglichkeit?
Sofern du entweder mindestens OpenGL 2.0 benutzt oder die Extension GL_ARB_texture_non_power_of_two verfügbar ist kann glTexImage2D mit Texturen beliebiger Größe umgehen. Das gilt auch für alle anderen Funktionen die mit Texturen arbeiten, etwa Framebuffer-Objekte.
gluBuild2DMipmaps sollte nicht benutzt werden. Der Grund das dies langsam ist ist wahrscheinlich das die Mipmaps auf der CPU generiert werden. Setze einfach
während die entsprechende Textur gebunden ist, dann werden die Mipmaps von der Grafikkarte automatisch erzeugt.
Wenn du OpenGL benutzen willst gibt es keine echte Alternative. Wenn die Grafikkarte nicht mit non_power_of_two umgehen kann, dann kann sie das halt nicht. Aber es ist natürlich möglich die Textur einfach entsprechend größer zu machen, also einen ungenutzten Rand zu lassen. Des weiteren kannst du die Textur auch strecken oder stauchen, was dann natürlich Qualitätsverluste mit sich bringt.
Edit:
Zitat:
Großartige Filter brauch ich nicht. Benutze eh GL_NEAREST.
Öhm, dumme Frage, aber brauchst du dann überhaupt Mipmaps? GL_NEAREST setzt man normalerweise ein wenn nicht skaliert werden muss. Übrigens gibt es auf heutiger Hardware zwischen der Verwendung von GL_NEAREST und GL_LINEAR keinen nennenswerten Geschwindigkeitsunterschied mehr, jedenfalls nicht wenn du nur ein Bild darstellen willst.
Danke erstmal für die Antwort. Ich habe halt diese gluBuild2DMipmaps benutzt, weil ich nicht wusste, wie ich sonst NPOT Texturen laden kann. Ich benutzte die aktuellste dglOpenGL.pas (da steht was von OpenGL 4.0). Aber wenn ich nun eine Textur mit glTexImage2D laden, wird sie nur angezeigt, wenn die Größe 2^n ist. Muss ich da noch was aktivieren vorher? Und wie benutzte ich die Extension GL_ARB_texture_non_power_of_two eigentlich? Googlen hat nicht wirklich was gebracht. Falls ich die überhaupt brauche bei meiner Header-Version.
Achso ok. Kann ich denn irgendwie explizit feststellen, ob NPOT Texturen unterstützt werden? Also muss ich dafür prüfen ob die OpenGL Version >2.0 oder die Extension gesetzt vorhanden ist? Und wenn ja, wie kann ich überprüfen, ob die Extension unterstützt wird?
Registriert: Mi Dez 03, 2008 12:01 Beiträge: 167 Wohnort: /country/germany
Programmiersprache: C++ / FreeBASIC
Wenn du glGetString(GL_EXTENSIONS) benutzt, bekommst du eine durch Leerzeichen getrennte Liste aller unterstützten Extensions. Du musst dann nur noch nachsehen, ob die Extension da drin steht.
_________________ Traue keinem Computer, den du nicht aus dem Fenster werfen kannst -- Steve Wozniak
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Ich würde dir ansonsten auch noch die komfortable dglCheckExtension-Funktion ans Herz legen. Extensionname rein, Boolean, der angibt, ob die Hardware das kann, raus.
greetings
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Danke für eure Hilfe. Leider unterstützt nur ein PC und nicht mein Notebook NPOT Matrizen. Was benutzte ich denn dann am besten als Alternative? Muss ich dann wirklich das langsame benutzten oder meine Textur in mehrere 2^n Stückchen aufteilen und aneinander setzten? Oder gibt es noch eine andere Möglichkeit? Das Bild muss bei vollem Zoom jeden Pixel korrekt anzeigen. Also auf 2^n skalieren und interpolieren würde leider nicht in Frage kommen.
gluBuild2DMipmaps skaliert das Bild so das es passt. Darum ist das auch so lahm. Also genau das was du nicht willst
Zitat:
Muss ich dann wirklich das langsame benutzten oder meine Textur in mehrere 2^n Stückchen aufteilen und aneinander setzten?
Wie schon zuvor erwähnt: Angenommen dein Bild ist 1280x1024, dann kannst du die Textur einfach 2048x2048 groß machen, das Bild in eine Ecke schieben und den Rest der Textur ungenutzt lassen. Verbrät zwar unsinnig Speicher, aber bei einem einzigen Bild ist das jetzt nicht sooo schlimm., insbesondere da auf den Speicher beim rendern ja nicht zugegriffen wird.
Desweiteren: Muss es den überhaupt OpenGL sein, tut es vielleicht auch eine Softwarelösung?
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
bei 1280x1024 ginge eventuell auch 2048x1024 als Texturgröße. Das braucht meines Wissens nach nicht einmal eine Extension.
greetings
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Di Okt 13, 2009 17:25 Beiträge: 365
Programmiersprache: C++
Wenn die Seiten der Texturen nicht gleich lang sind, braucht man soweit ich weiß die Extension GL_TEXTURE_RECTANGLE_EXT. Übrigens kann man oft auch Speicher sparen, indem man mehrere kleine Texturen in eine große packt, so dass man (annähernd) an eine POT-Größe kommt.
Zuletzt geändert von mrtrain am Mi Aug 31, 2011 20:58, insgesamt 1-mal geändert.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Zitat:
OpenGL texturing is limited to images with power-of-two dimensions and an optional 1-texel border. The ARB_texture_rectangle extension adds a new texture target that supports 2D textures without requiring power-of-two dimensions.
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
@mrtrain: Was du schreibst ist ein häufig gelesener Irrtum. Siehe was das was der Lord zitiert hat: GL_TEXTURE_RECTANGLE_EXT ermöglicht nonPowerOf2 Texturen. Texturen durften schon immer(!) ungleichlange Seiten haben (also z.B. 512x64).
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Danke für die Antworten. Dann kann ich damit ja direkt überprüfen, ob NPOT Texturen möglich sind. Das Problem ist, wenn keine NPOT Texturen möglich sind, muss ich ordentlich Speicher verschwenden. Denn eine übliche Texturgröße ist 4500x4500. Dann müsste ich die Textur bis 8192x8192 puschen. Was mir auch aufgefallen ist, dass bei ungeraden Texturgrößen teilweise Darstellungsfehler auftreten. Vielleicht sollte ich wirklich das Ganze ohne OpenGL lösen. Gibt es denn bei Delphi vielleicht schon eine fertige Komponente, auf der ich ein ziemlich großes Bild recht flüssig verschieben und skalieren kann? Kann mir vorstellen, dass das mit der Skalierung ohne Hardwarebeschleunigung ein Problem werden könnte.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Also meine Grafikkarte kann keine 8192x8192 Texturen . Das ist vermutlich ein größeres Problem als texture_rectangle, die Erweiterung habe ich nämlich…
Wenn du das Verschieben mit BitBlt (wenn du nur Windows als Ziel hast) und das Skalieren mit einer eigenen, schnellen Funktion, die nur den entsprechenden Ausschnitt berechnet, machst, könnte das schon funktionieren.
greetings
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.