texture update



  • Hallo,

    ich handle in OpenGL mit großen Texturen, diese werden nicht langsam über
    gluMipMap in den Speicher gekachelt, sondern ich lasse das die Harware
    machen indem ich den Schalter setze:
    glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);

    und dann via glTexImage2D die Textur in den Speicher als mipmap erzeuge.

    Gibt es eine Möglichkeit ähnlich den VBO's auch einen Zeiger auf die
    Textur in der Grafikhardware zu erlangen, um diese schneller updaten zu können ?

    Beispielbild : http://www.visiongrid.de/fasttxt.jpg

    Danke für Hinweise.


  • Mod

    jede hardware hat ihre wege texturen im speicher abzulegen, von daher kannst du keinen zeiger darauf bekommen, da du garnicht weisst wie die daten liegen muessen.
    glTexSubImage2D sollte dabei das schnellste sein.
    mipmaps werden meines wissens nach auf cpu-seite erstellt, wenn du es schnell haben moechtest, waere es wohl am besten wenn deine daten schon fertig mit mipmaps vorliegen.



  • Also Gerade VBO's liefern zeiger auf die Daten in der Karte dito für Framebuffers, deren verwendung zum rendern in Texturen vorliegen. Die Mipmap
    wurde nun bereits bei TexImage erzeugt weil ja wie erklärt der Schalter
    gesetzt war.

    So erzeuge ich bei 1600x1200 eine Frequenz von ca 4Hz, was ja schon ganz
    nett ist, dennoch würde ich gern das Texturfeld über einen Zeiger erneuern
    bei Texturen gleicher Seitenlänge und kleiner 512 gibt es ja nun kein Performance probleme, da das MipMapKaccheln garnich erst nötig wird.

    Dies Ruft immer stehts mehrmals glTexImage2D auf, das einfach mittels
    glTexSubImage2D ultraschnell ersetzt werden kann.

    Bei Mipmaps also gekachelten glTexImage2D siehts ja nun anders aus.



  • Was du suchst, nennt sich Pixel Buffer Object (PBO). Allerdings bekommst nie direkt einen Zeiger in den Grafikspeicher (VRAM), das geht rein prinzipiell gar nicht, da es sich um separaten Speicher auf der Grafikkarten handelt, auf den die CPU gar keinen Zugriff hat (zumindest bei einer dedizierten Grafikkarte). Wenn du z.B. ein VBO mappest, dann allokiert der Grafiktreiber Speicher im normalen RAM und gibt dir einen Zeiger dort hin, damit du deine Daten reinschreiben kannst. Wenn du dann unmappest, kümmert sich der Treiber drum, die Daten von dort auf die Grafikkarte zu laden (das funktioniert normalerweise so, dass der Treiber ein Kommando an die Karte schickt, die dann einen DMA Transfer vom RAM in den VRAM ausführt).



  • Es ist mir klar das es ein Hardwaremapping ist,
    dies ist jedoch sehr perform, so kann die Grafikhardware
    diese Bereiche sehr viel schneller übertragen, wenn diese
    vorher abgesprochen wurden, (Speicherfenster)

    Gut Danke für den Hinweis, Pixel Buffer Object (PBO).


  • Mod

    dot schrieb:

    ...das geht rein prinzipiell gar nicht, da es sich um separaten Speicher auf der Grafikkarten handelt, auf den die CPU gar keinen Zugriff hat (zumindest bei einer dedizierten Grafikkarte)...

    die CPU hat direkten zugriff auf den speicher, da dieser auf einen virtuellen addressraum gemappt wird, ich denke 99.9% der kommunikation zwischen cpu und der hardware laeuft darueber ab (ports interrupts usw. waren eher 16bit altlasten).
    auch frueher zu VGA,EGA, Hercules zeiten konnte man schon auf diesen separaten speicher auf graphikkarten zugreifen, der unterschied ist nur dass es nicht virtueller und dynamisch zugeteilter addressraum war, sondern fest definierter (ich glaube bei VGA war das 0a0000h)

    Wenn du z.B. ein VBO mappest, dann allokiert der Grafiktreiber Speicher im normalen RAM und gibt dir einen Zeiger dort hin, damit du deine Daten reinschreiben kannst. Wenn du dann unmappest, kümmert sich der Treiber drum, die Daten von dort auf die Grafikkarte zu laden (das funktioniert normalerweise so, dass der Treiber ein Kommando an die Karte schickt, die dann einen DMA Transfer vom RAM in den VRAM ausführt).

    das haengt vom betriebssystem ab, unter windows kuemmert sich wohl windows um die ganzen buffer, was teil vom driver model ist. Es gibt keine direkte kommunikation zwischen user space und driver space, auf diese weise kann hardware oder ein treiber abstuertzen oder man kann windows jeder zeit in sleep versetzen, und windows startet den treiber einfach neu und alles laeuft weiter.

    aber das alles bringt bei texturen keinen unterschied, weil sie, wie schon gesagt, anders im graphikkarten speicher liegen z.b. als kacheln oder geswizzled oder mit speziellem padding oder die mipmaps sind interleaved etc.



  • Ja es ward 0xA000 :))

    Danke für eure Hinweise..


Anmelden zum Antworten