Schnellste Methode ein Bild zu laden mit directx9

Hallo zusammen,

ich bin gerade dabei ein Programm zu schreiben, das Bilder in zufälliger Reihenfolge auf mehreren Flächen darstellen soll. Wobei sich die Flächen im Raum bewegen und rotieren etc.

jetzt ist meine Frage:

Welche Methode ist am schnellsten wenn es darum geht Bilder zu laden (die können bis zu 4096X4096 Pixel groß werden)?

Ich habe es versucht mit der D3DXCreateTextureFromFile und der D3DXLoadSurfaceFromFile. Ich habe mich dabei vom IE inspirieren lassen, wenn ich da ein so großes JPG, nur als Beispiel, reinziehe und darstellen lasse, geht das binnen Sekundenbruchteilen. Diese Performance konnte ich bis jetzt noch nicht erreichen.

Ich gebe zu bedenken, das ich auch leider nur sehr begrenzten Speicherplatz zur Verfügung habe, oh und natürlich programmier ich auf der Windows Plattform… eben directx9 halt =8)

mfG

Swen

Hallo,

Ich habe mich dabei vom IE
inspirieren lassen, wenn ich da ein so großes JPG, nur als
Beispiel, reinziehe und darstellen lasse, geht das binnen
Sekundenbruchteilen. Diese Performance konnte ich bis jetzt
noch nicht erreichen.

Du bringst da auch einiges durcheinander. Willst Du die Grafik jetzt als „Textur“ auf irgend einer anderen Fläche 3D-animieren? Wo macht denn das der IE? Da wird einfach eine 2D-Grafik geladen und dargestellt. Das ist erheblich weniger Aufwand.

Ich gebe zu bedenken, das ich auch leider nur sehr begrenzten
Speicherplatz zur Verfügung habe

Wie passen Grafiken mit 4096x4096 Punkte und „sehr begrezter Speicher“ zusammen? Richtig. Gar nicht. Hast Du mal so ein Bild (und sei es auch per jpeg komprimiert) in den IE geladen? Das dauert auch seine Zeit! Unkomprimiert hätte so eine Datei immerhin >48MB bei 24bpp.

Gruß

Fritze

Hallo Fritze,

also ich möchte die Bilder in eine Textur laden. Das anlegen eines Speicherbereiches für eine Textur benötigt eine Zeitspanne unter 1 Millisekunde, also schon sehr schnell. Wobei angemerkt sei, das ich die Textur ohne MipMap Levels erstelle und keinerlei Filtering auf das zu ladende Bild anwende. Meine Frage ist eben warum, wenn das reservieren des Speichers für eine Textur so unglaublich schnell geht, es so lange dauert die Bilddaten da hineinzuschreiben. Vielleicht habe ich da ja tatsächlich noch etwas übersehen, aber ich dachte das im Prinzip nach Reservierung des Speichers für die Textur das eigentliche kopieren des Bildes in die Textur mit der Performance des IE vergleichbar sein müsste. wie gesagt vielleicht übersehe ich da was oder sehe das ganze auch zu blauäugig. Wenn du also da vielleicht nen Tipp hast woran es noch liegen könnte…

Und die Sache mit dem begrenzten Speicher habe ich vielleicht auch mißverständlich dargestellt: Ich möchte mehrere Bilder in der entsprechenden Größe darstellen und ich kann es mir nicht leisten 20 davon sozusagen vorzuladen, also bei Programmstart die ganzen Texturen erstellen zu lassen, bevor irgendwas angezeigt wird, sondern muß darauf zurückgreifen während des laufenden Programms die Texturen nachzuladen. die Größe von 4096X4096 Pixeln ist einfach die größtmögliche Textur die meine Grafikkarte handlen kann.

Fällt dir vielleicht trotzdem was dazu ein?

Grüße

Swen

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

Glaub’s mir einfach. Eine Textur mit 4096 x 4096 (x 24?) ist viel zu groß! Das muss grottenlahm werden. Selbst Unreal 2003 nutzt weitgehend 256x256 Texturen! Die Grafik muss ja nicht nur geladen, sondern auch korrekt auf die Fläche projeziert werden.

Der IE macht nichts dergleichen. Wieso vergleichst Du ständig Äpfel mit Birnen? Oder Bitmaps im 2D- mit Texturen im 3D-Bereich?

Gruß

Fritze

Hi Fritze,

=8) mir war schon bewusst, das 4096X4096 sehr lange braucht eben weil es einig wenige Pixel sind die da mal eben erzeugt werden oder kopiert werden sollen…

darum gehts mir auch gar nicht, auch die Tatsache, das man am besten große Bilder in mehrere kleine 256X256 Bilder splittet war mir auch schon bekannt. Das problem ist, letzten endes sind das alles nur Bits die von einer Speicherstelle zur nächsten verschoben werden, deshalb vergleiche ich auch dauernd „Äpfel“ mit „Birnen“, denn schließlich werden die Bilddaten in beiden Fällen in der Grafikkarte abgelegt.

Und da bei einer 3D Grafik auch die Bilddaten einer 2D Textur verwendet werden, kann man das schon vergleichen.

Meine Frage bleibt nach wie vor die selbe, was ist die schnellste Methode ein Bild, nennen wir es mal bild.bmp mit 24 Bit Frabtiefe und einer Größe von 2048 X 1080 (just for fun) auf ein 3D Objekt zu knallen?

Unter der Vorraussetzung, das das ganze zur Laufzeit passieren muß. Sowohl das laden des Bildes von der Festplatte als auch das erstellen einer Textur auf dem 3D Objekt.

soooooo… =8) irgend eine Idee?

Grüße,

Swen

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

Und da bei einer 3D Grafik auch die Bilddaten einer 2D Textur
verwendet werden, kann man das schon vergleichen.

Kann man nicht. In dem einen Fall werden einfach nur die Pixel angezeigt, wie sie in dem zweidimensionalen Bild angeordnet sind. In dem anderen Fall werden die Pixel nicht einfach aufgerufen, sondern das Bild wird auf eine dreidimensionale Fläche projeziert. Wenn Du nicht einsehen kannst, dass so eine Aktion erheblich komplexer und rechenaufwändiger ist, als ein simples „anmalen“ einer 2D Fläche, dann kann ich Dir auch nicht weiterhelfen.

Gruß

Fritze

Hi Fritze,

meinst du vielleicht das das Bild entsprechend der Texturkoordinaten eventuell gestreckt oder neu berechnet werden muß?

(by the way hast du vielleicht auch eine antwort auf die eigentliche Frage: nämlich was der schnellste weg ist ein Bild als Textur darzustellen und auf ein 3D Objekt zu knallen?)

Nur ein verdacht von mir aber zur eigentlichen frage habe ich von dir noch keine Äusserung…

Grüße

Swen

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

meinst du vielleicht das das Bild entsprechend der
Texturkoordinaten eventuell gestreckt oder neu berechnet
werden muß?

Gestreckt, gestaucht, verzerrt, rotiert, etc.

(by the way hast du vielleicht auch eine antwort auf die
eigentliche Frage: nämlich was der schnellste weg ist ein Bild
als Textur darzustellen und auf ein 3D Objekt zu knallen?)

http://mitglied.lycos.de/neochat/tutVB_d3dtex.htm

Nur ein verdacht von mir aber zur eigentlichen frage habe ich
von dir noch keine Äusserung…

Ich dachte, Du hast die Lösung schon und wunderst Dich nur, wieso es so lange dauert.

Gruß

Fritze

Hi Fritze,

hehehe… ich habe natürlich eine Methode gefunden ein Bild in eine Textur zu packen… das strecken, stauchen, verzerren, rotieren, etc. mache ich ja auch schon nur ist es ja so, das die Bilddaten an sich nicht gestreckt, gestaucht, etc. in der Textur selber vorliegen, denn ich kann ja die selbe Textur auf verschiedene Objekte anwenden, wobei bei jedem Objekt die Rotation, skalierung und verzerrung ja anders sein kann. Wie du schon richtig vermutest habe ich eine Möglichkeit gefunden Texturen zu erstellen.

Aber das dauert mir eben etwas zu lange. Es gäbe ja grundsätzlich die Möglichkeit große Bilder in viele kleine Aufzuteilen. Kennst du vielleicht noch eine andere Möglichkeit?

Grüße
Swen

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

habe Deine Antwort erst jetzt gesehen.

hehehe… ich habe natürlich eine Methode gefunden ein Bild
in eine Textur zu packen… das strecken, stauchen,
verzerren, rotieren, etc. mache ich ja auch schon nur ist es
ja so, das die Bilddaten an sich nicht gestreckt, gestaucht,
etc. in der Textur selber vorliegen, denn ich kann ja die
selbe Textur auf verschiedene Objekte anwenden, wobei bei
jedem Objekt die Rotation, skalierung und verzerrung ja anders
sein kann.

Eben genau deshalbt dauert es mit der Darstellung vergleichsweise lange, weil eben jedes mal rotiert, gestaucht und verzerrt werden muss. Das reine kopieren der Bilddaten in den Texturspeicher sollte nicht lange dauern, insbesondere bei AGP Karten, oder meinst Du das?

Wie du schon richtig vermutest habe ich eine
Möglichkeit gefunden Texturen zu erstellen.

Na bestens :smile:

Aber das dauert mir eben etwas zu lange. Es gäbe ja
grundsätzlich die Möglichkeit große Bilder in viele kleine
Aufzuteilen. Kennst du vielleicht noch eine andere
Möglichkeit?

Nein. Die Aufteilung ist die Methode der Wahl.

Gruß

Fritze