Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 04, 2025 01:30

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 18 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Texturgröße
BeitragVerfasst: Mi Nov 24, 2010 21:20 
Offline
DGL Member

Registriert: Fr Mai 14, 2010 08:34
Beiträge: 54
Guten Tag!

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?

Grüße!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texturgröße
BeitragVerfasst: Mi Nov 24, 2010 22:18 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
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
Code:
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, true);

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.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texturgröße
BeitragVerfasst: Do Nov 25, 2010 00:13 
Offline
DGL Member

Registriert: Fr Mai 14, 2010 08:34
Beiträge: 54
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texturgröße
BeitragVerfasst: Do Nov 25, 2010 10:19 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Ich benutzte die aktuellste dglOpenGL.pas (da steht was von OpenGL 4.0)

Aktivieren musst du nichts, aber deine Grafikkarte bzw. auch der Treiber muss das können. Lass dir mal die verwendete OpenGL Version ausgeben:
Code:
glGetString(GL_VERSION)

Die Funktion wirft einen nullterminierten String aus.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texturgröße
BeitragVerfasst: Do Nov 25, 2010 11:08 
Offline
DGL Member

Registriert: Fr Mai 14, 2010 08:34
Beiträge: 54
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?

Grüße.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texturgröße
BeitragVerfasst: Do Nov 25, 2010 11:11 
Offline
DGL Member
Benutzeravatar

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texturgröße
BeitragVerfasst: Do Nov 25, 2010 19:07 
Offline
DGL Member
Benutzeravatar

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 networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texturgröße
BeitragVerfasst: Fr Nov 26, 2010 23:05 
Offline
DGL Member

Registriert: Fr Mai 14, 2010 08:34
Beiträge: 54
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texturgröße
BeitragVerfasst: Fr Nov 26, 2010 23:16 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Muss ich dann wirklich das langsame benutzten

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?

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texturgröße
BeitragVerfasst: Sa Nov 27, 2010 12:24 
Offline
DGL Member
Benutzeravatar

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 networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texturgröße
BeitragVerfasst: Sa Nov 27, 2010 12:55 
Offline
DGL Member

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.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texturgröße
BeitragVerfasst: Sa Nov 27, 2010 19:30 
Offline
DGL Member
Benutzeravatar

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.
http://www.opengl.org/registry/specs/ARB/texture_rectangle.txt

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texturgröße
BeitragVerfasst: Sa Nov 27, 2010 22:18 
Offline
Guitar Hero
Benutzeravatar

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texturgröße
BeitragVerfasst: So Nov 28, 2010 11:20 
Offline
DGL Member

Registriert: Fr Mai 14, 2010 08:34
Beiträge: 54
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.

Grüße


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texturgröße
BeitragVerfasst: So Nov 28, 2010 12:45 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Also meine Grafikkarte kann keine 8192x8192 Texturen :shock: . 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 networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 18 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: Majestic-12 [Bot] 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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 16 Queries | GZIP : On ]