Das würde also bedeuten wenn mit die Funktion 2048 liefert, kann ich mit einer maximalen 3D-Texturen von 2048x2048x2048 arbeiten? Gibts da noch weitere Einschränkungen, wie z.B. die Anzahl der Bytes/Texel(also das interetexurformat) oder so etwas? Der Speicherunterschied zwischen z.B.: 2048x2048x2048 * GL_LUMINANCE und 2048x2048x2048 * GL_RGBA wäre ja schon erheblich... oder geht es dabei nicht um den Inhalt der Texel sondern nur ihre Indizierung?
Ich vermute, dass mit Absicht in der Wiki nur von Texture1D und Texture2D die Rede ist, weil wie du es richtig selbst feststellst, sind 2048³ ne GANZE Menge Speicher. Bei 4 Byte je Texel wären das 32 GB. Das ist ne Menge. ^^ Wie man nun die maximale Tiefe rausfindet - keine Ahnung. Höchst wahrscheinlich kann die Grafikkarte THEORETISCH mit 2048³ rechnen, aber der Platz fehlt, wie gesagt. So kann man z.B. halt 64x64x2048 nutzen,was "nur" 32 MB wären. Aber die Tiefe ist 2048!
_________________ Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut. Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’. Und du schaust mich an und fragst ob ich das kann. Und ich denk, ich werd' mich ändern irgendwann. _________________Farin Urlaub - Bewegungslos
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Wenn im Wiki was fehlt, dann bitte Nachtragen. Das Wiki lebt und ist nicht von 0 auf 100 Perfekt.
Ich denke du hast hier eine unsauberkeit in der Spezifikation gefunden. In der orginalen beschreibung zu glTexImage3D steht bei den Fehlermeldungen nämlich gar nichts zu MAX_3D_TEXTURE_SIZE. Dort wird gesagt, dass depth in genau den selben Grenzen wie height und width liegen muss, als MAX_TEXTURE_SIZE.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Die Speichergröße ist demnach schon eine Eineschränkung für die Maße der Textur, gibts eine Möglichkeit die maximale Speichergröße für eine (3D-)Textur zu ermitteln? Die Maße könnte man ja dann anpassen, solange sie kleiner als GL_MAX_3D_TEXTURE_SIZE sind.
Zitat:
Wenn im Wiki was fehlt, dann bitte Nachtragen. Das Wiki lebt und ist nicht von 0 auf 100 Perfekt.
Sobald ich mir sicher mit allem bin, werd ich dem gerne nachkommen und einen Erläuterung dazu schreiben.
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Flash hat geschrieben:
Die max_größe ist von den Konstanten abhängig und sonst nur von deinem Speicher auf der GraKa.
Das stimmt so nicht. Begrenzend ist hier nicht der VRAM, sondern der Arbeitsspeicher, da Grafikkarten Texturen ja in eben diesen auch auslagern können, und zwar ohne dass man es als Entwickler evtl. mitbekommt. Und leider gibt es keine echte Möglichkeit dies unter OpenGL zu ermitteln. Es gibt zwar GL_TEXTURE_RESIDENT, aber als ich das mal probiert habe sah es so aus dass es (je nach Hersteller) meistens TRUE war, da kann man sich also auch nicht drauf verlassen.
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Aber gehe ich wenigstens recht in der Annahme, dass eine Textur entweder komplett im GRAM oder komplett im RAM liegt? Oder können auch nur Teile einer Textur ausgelagert werden?
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Liefert diese Funktion schon brauchbare Werte? Die maximale Größe einer Textur ist ja von mehreren Faktoren abhängig (Bytes per Pixel, Mipmaps, ...). Daher denke ich Proxy Texturen sind die bessere Lösung.
Zitat:
Aber gehe ich wenigstens recht in der Annahme, dass eine Textur entweder komplett im GRAM oder komplett im RAM liegt? Oder können auch nur Teile einer Textur ausgelagert werden?
Würde wohl kaum Sinn ergeben. Wie soll den OpenGL im Vorhinein wissen welcher Teil einer Textur benötigt wird.
Registriert: Di Dez 27, 2005 12:44 Beiträge: 393 Wohnort: Berlin
Programmiersprache: Java, C++, Groovy
Hallo,
ich glaube die 3D-Textur muß komplett in den Grafikspeicher passen. Nur wenn man mehrere Blöcke hätte, könnten diese stückweise ausgelagert werden. Höchstens bei Array Textures hätte man vielleicht die Chance, daß für eine 3D-Textur sowohl Grafikspeicher als auch VRAM benutzt werden.
Leider gibt es bei OpenGL keine direkte Methode um den freien Texturspeicher zu bestimmen, daß muß man denk ich mal selbst über die Anwendung regeln.
GL_MAX_3D_TEXTURE_SIZE gibt glaub ich die maximale Dimension der 3D-Textur an, also theoretisch müsste es dann bei einer Größe von 2049x10x10 einen GL_ERROR geben.
Viele Grüße dj3hut1
_________________ Wenn Gauß heute lebte, wäre er ein Hacker. Peter Sarnak, Professor an der Princeton University
GL_MAX_3D_TEXTURE_SIZE liefert die maximal erlaubte Kantenlänge einer 3D-Textur in Texeln. Das hat wahrscheinlich damit zu tun wie Texturkoordinaten intern verarbeitet werden. Was dabei dann genau ein Texel ist spielt keine Rolle. Ein Texel kann bis zu 16 Bytes groß sein, wenn z.B. RGBA32F als Datentyp benutzt wird. Ein weiteres Limit stellt wie schon erwähnt der Speicher der Grafikkarte dar. Ob eine Textur vollständig im Speicher liegen muss ist nach meinem Wissen nicht definiert. Es ist möglich, dass ein schlauer Treiber die Textur nur im Grafikspeicher cacht und aus dem Hauptspeicher bei Bedarf nach lädt. Der Hauptspeicher könnte wiederum auf der Festplatte swappen. Aber "möglich" heißt nicht das dies so sein "muss". Allerdings sollte sowieso klar sein, dass so was nicht sonderlich schnell sein kann....insbesondere, wenn die Textur auch noch von der Festplatte geladen werden muss. Das geht nur wenn hinter dem nachladen eine "Intelligenz" steht. (siehe MegaTextures unten)
Fazit: Wer große Texturen benötigt die nicht in den Grafikspeicher passen und/oder GL_MAX_3D_TEXTURE_SIZE sprengen sollte auf TBOs zurückgreifen. Ein TBO kann bis zu 2^27 Texel groß werden, was bei RGBA32F genau 2 GB entspricht. Das ist zwar weniger als die 128 GB der 3D-Textur, aber man kann selbst festlegen wie die Dimensionen der Textur sein sollen. Bei derartig großen Texturen sollte man überlegen ob man nicht den MegaTexture-Ansatz auf 3D erweitert. Die id Tech 5 Engine (z.B. Doom 4, ...) unterstützt virtuelle Texturen mit bis zu 128000x128000 Pixeln. Die Textur wird dynamisch von der Festplatte nachgeladen. Das Limit ist eigentlich nur die Auflösung der Texturkoordinaten (32bit float).
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Man sollte diese Infos mal im Textur Artikel ergänzen.
Eine Frage nochmal zur Größe. GL_MAX_TEXTURE_SIZE sagt doch schon wie groß eine Textur in breite höhe und (laut Abschnitt "Fehlermeldungen" bei glTexImage3D) auch in der Tiefe maximal sein darf.
Oder ist das ein Fehler in der Spec und GL_MAX_TEXTURE_SIZE ist nur bezogen auf Breite und Höhe und _MAX_3D_TEXTURE_SIZE nur auf die Tiefe?
_________________ Blog: kevin-fleischer.de und fbaingermany.com
The maximum allowable width, height, or depth of a three-dimensional texture image is an implementation dependent function of the level-of-detail and internal format of the resulting image array. It must be at least 2k−lod +2bt for image arrays of level-of-detail 0 through k, where k is the log base 2 of MAX 3D TEXTURE SIZE, lod is the level-of-detail of the image array, and bt is the maximum border width. It may be zero for image arrays of any level-of-detail greater than k. The error INVALID VALUE is generated if the specified image is too large to be stored under any conditions.
Wenn man den Border vernachlässigt heißt das, dass die Textur nicht größer als eben GL_MAX_3D_TEXTURE_SIZE sein darf.
Mitglieder in diesem Forum: 0 Mitglieder und 2 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.