ZFX
ZFX Neu
Home
Community
Neueste Posts
Chat
FAQ
IOTW
Tutorials
Bücher
zfxCON
ZFXCE
Mathlib
ASSIMP
NES
Wir über uns
Impressum
Regeln
Suchen
Mitgliederliste
Membername:
Passwort:
Besucher:
4440912
Jetzt (Chat):
17 (0)
Mitglieder:
5239
Themen:
24223
Nachrichten:
234554
Neuestes Mitglied:
-insane-

ZFX
Coding-Foren
OpenGL API + SDL
Schneller Texture-Upload [gelöst]
Normal
AutorThema
Thot Offline
ZFX'ler


Registriert seit:
29.02.2008

Nordrhein-Westfalen
Schneller Texture-Upload [gelöst]Nach oben.
Hi Leute,
ich habe ein Problem mit dem Upload von Texturen. Ich muss für jeden Frame eine 3D-Texture auf die Grafikkarte laden. Das Problem ist, dass diese Texturen alle relativ groß sind (vielfaches von 3.8 MB) und der Upload, bei mir, ziemlich lange dauert; trotz 16x PCI-E.

Der Code um erzeugen der Texture ist:

void createTextures(int size) {
glEnable(GL_TEXTURE_3D);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
int imageSize = size * 4 * 2 * numofslides;
unsigned char* image = new unsigned char[imageSize];
memset(image, ((unsigned char)1), imageSize);
glGenTextures(1, &textureHandles);
glBindTexture(GL_TEXTURE_3D, textureHandles);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP);

glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage3D(GL_TEXTURE_3D, 0, 4, witdh, height, numofslides, 0, GL_BGRA, GL_UNSIGNED_BYTE, image);
delete[] image;
}

und zum Updaten ist der Code:

void setTexture(int* data) {
glBindTexture(GL_TEXTURE_3D, textureHandles);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexImage3D(GL_TEXTURE_3D, 0, 4, witdh, height, numofslides, 0, GL_BGRA, GL_UNSIGNED_BYTE, data);
}

Zur Zeit dauert der Upload bei 4 slides (also ca. 7.6 MB) etwa 14ms - was für meine Zwecke viel zu langsam ist.

Kennt vielleicht jemand eine Möglichkeit, wie ich die Texturen schneller auf die Grafikkarte laden kann. Ich glaube nicht, dass damit das Maximum schon erreicht ist (etwa. 540MB/sec).

1 Mal gendert, zuletzt am 03.03.2009, 16:26:23 Uhr von Thot.
25.02.2009, 21:03:42 Uhr
suke Offline
ZFX'ler


Registriert seit:
18.01.2007

Österreich
Re: Schneller Texture-UploadNach oben.
Hi Thot,

Ich hab deinen Post mal schnell überflogen und hab den Bottleneck bei glTexImage3D in setTexture gefunden. Wenn sich die Größe der Textur nicht mehr ändert, solltest du für das Kopieren glTexSubImage benutzen, da glTexImage den alten Speicher frei gibt und neuen Speicher reserviert. Bei glTexSubImage wird nur in die Textur kopiert und kein neuer Speicher reserviert.

MfG
suke
25.02.2009, 21:24:46 Uhr
Thot Offline
ZFX'ler


Registriert seit:
29.02.2008

Nordrhein-Westfalen
Re: Schneller Texture-UploadNach oben.
Hi suke,

danke für die schnelle Antwort. Ich habe es gleich ausprobiert - hat aber leider nichts gebracht.
25.02.2009, 21:35:15 Uhr
6SidedDice Offline
Job-Moderator


Registriert seit:
16.10.2002

Nordrhein-Westfalen
161010163
Re: Schneller Texture-UploadNach oben.
Jedes Frame eine Textur neu erstellen? Das ist natürlich langsam, warum machst du das überhaupt?
Die Textur einmal erstellen und dann nachträglich verändern sollte dagegen schneller gehen.
25.02.2009, 21:50:45 Uhr
Thot Offline
ZFX'ler


Registriert seit:
29.02.2008

Nordrhein-Westfalen
Re: Schneller Texture-UploadNach oben.
Hi 6SidedDice,

leider geht das nicht, da die einzelnen Slides zusammen das eigentliche Bild ergeben. Die einzelnen Slides werden im Fragment-Shader zu einer Texture zusammengefügt (das kostet fast nichts). Dann wird diese Texture angezeigt.
Das Problem ist, dass das zusammenfügen auf der CPU viel Zeit in Anspruch nimmt - im Shader jedoch nicht (<1ms). Dafür ist bei mir aber das kopieren auf die Grafikkarte teuer und das frisst den Gewinn wieder auf.

Gibt es vielleicht ein Möglichkeit die Texturen asychron hochzuladen - das würde schon etwas helfen.

1 Mal gendert, zuletzt am 25.02.2009, 22:21:59 Uhr von Thot.
25.02.2009, 22:09:25 Uhr
Krishty Offline
ZFX'ler


Registriert seit:
01.02.2004

Nordrhein-Westfalen
342173470
Re: Schneller Texture-UploadNach oben.
Was ist ein Slide?

Und ändern die sich jeden Frame?

Gruß, Ky
25.02.2009, 22:48:31 Uhr
Thot Offline
ZFX'ler


Registriert seit:
29.02.2008

Nordrhein-Westfalen
Re: Schneller Texture-UploadNach oben.
Ein Slide ist eine Ebene in der 3D Texture.
Ja, die können sich vollständig in jedem Bild ändern - daher können sie (im Allgemeinen) nicht wieder verwendet werden.
26.02.2009, 09:05:12 Uhr
Kimmi Offline
ZFX'ler


Registriert seit:
10.10.2002

Schleswig-Holstein
93425079
Re: Schneller Texture-UploadNach oben.
Ändert sich wirklich die ganze Textur oder nur Teilbereiche? Vielleicht könntest du nur die Änderungen nachladen, wenn möglich.

Gruß Kimmi

P.S.: Es gibt ein neues ZFX-BOard: new.zfx.info.
26.02.2009, 11:25:33 Uhr
Kurzer Weblog
Thot Offline
ZFX'ler


Registriert seit:
29.02.2008

Nordrhein-Westfalen
Re: Schneller Texture-UploadNach oben.
Nee, leider ändert sich im Allgemeinen die gesamte Texture - in allen Ebenen, jeder Pixel
Im Allgemeinen heißt: immer wenn sich der Benutzer bewegt

1 Mal gendert, zuletzt am 26.02.2009, 12:06:51 Uhr von Thot.
26.02.2009, 12:06:26 Uhr
Helmut Offline
ZFX'ler


Registriert seit:
11.07.2002

Deutschland
280083044 helmut4242
Re: Schneller Texture-UploadNach oben.
Du könntest das sicher etwas beschleunigen, wenn du die Texturen komprimierst und im Shader wieder auspackst. Mit Google solltest du schnell fündig werden.

Ciao
26.02.2009, 12:45:25 Uhr
Bomber-Revolution
Ingrater Offline
ZFX'ler


Registriert seit:
18.04.2007

Baden-Württemberg
Re: Schneller Texture-UploadNach oben.
Ganz ehrlich, ich glaube nicht dass das hochladen der 3,8 mb texture dein bottleneck ist. Ich habe eine Marching Cubes implementation die jedes Frame vor der optimierung 64 mb 3d textur auf die grafikkarte geprügelt hat und das optimieren nur durch hochladen des Teils der verändert wurde hat praktisch nichts gebracht.

glTexSubImage kopiert jedes mal die textur die du spzifizierst erst in the managed pool des ogl treibers und dann auf die graka. D.h. du hast 2 kopieroperationen der Daten. Möchtest du das ganze optimieren solltest du pixel buffer objects verwenden.

http://www.opengl.org/registry/specs/ARB/pixel_buffer_object.txt

Weiter unten gibt es ein Beispiel zu "streaming textures with pixel buffer objects"

MFG Ingrater
01.03.2009, 09:53:19 Uhr
Thot Offline
ZFX'ler


Registriert seit:
29.02.2008

Nordrhein-Westfalen
Re: Schneller Texture-UploadNach oben.
Hi Ingrater,

das mit PBOs hat es gebracht. Anstatt die Texturen erst zwischenzuspeichern schreibe ich sie direkt in den Buffer, was vorher nicht ging. Das ganze hat mir auf dem Testsystem ca. 8 FPS gebracht und es sollten in der späteren Umgebung vermutlich noch mehr werden.

Danke

Gruß Thot

1 Mal gendert, zuletzt am 03.03.2009, 16:31:12 Uhr von Thot.
03.03.2009, 16:24:50 Uhr
Normal


ZFX Community Software, Version 0.9.1
Copyright 2002-2003 by Steffen Engel