OpenGl - TexturUpdate
-
Nein, das ist nicht das, was ich gesucht hab... Hierbei müsste ich ja die änderungen als eine art "neue textur" einem neuen array mit anderer größe abspeichern, um sie dann in die textur zu kopieren...
ich hatte an etwas gedacht, wo ich die bereits existierenden daten für benutzt kann... trotzdem danke
-
das ist aber der weg wie man bei oGL die textures updated, eine einmal existierende textur wird mit neuem inhalt gefüllt.
was genau möchtest du anders machen?
rapso->greets();
-
Du könntest die bereits exististierenden Daten doch benutzen. Du darfst nur nicht das Array, was du beim ersten Erstellen deiner Textur angibst, löschen. Diese Daten können verändert und dann mit glCopyTexSubImage upgedated werden.
-
Das tu ich ja... also ich lösche die nicht, ich benutzt die noch immer
Ich geb hier mal ein Beispiel:
class Surface { public: int width, height; int realWidth, realHeight; float glTextureWidth, glTextureHeight; unsigned int nr; Rect changes; char *data; inline Surface(); inline void update(bool all=false); inline void setPixel(int, int, char, char, char); inline void setAlpha(int, int, char); }; Surface *a = engine.createPic(200, 200); Surface *Engine::createPic(int width, int height) { int realWidth = nextPow(2, width); int realHeight = nextPow(2, height); char *data = new char[realWidth * realHeight * 4]; memset(data, 255, realWidth * realHeight * 4); return( createPic( width, height, realWidth, realHeight, data ) ); } Surface *Engine::createPic(int width, int height, int texWidth, int texHeight, char *data) { Surface *s = makeNewSurface(width, height, texWidth, texHeight); s->data = data; glGenTextures(1, &s->nr); bindTexture(s->nr); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); s->update( true ); return( s ); } Surface *Engine::makeNewSurface(int w, int h, int tw, int th ) { Surface *ret = new Surface; ret->glTextureWidth = (float)w / (float)tw; ret->glTextureHeight = (float)h / (float)th; ret->width = w; ret->height = h; ret->realWidth = tw; ret->realHeight = th; return( ret ); } inline void Surface::update(bool all) { bindTexture( nr ); //if( all ) { glTexImage2D(GL_TEXTURE_2D, 0, 4, realWidth, realHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); /*} else { if( changes.width ) { glTexSubImage2D(GL_TEXTURE_2D, 0, changes.x, changes.y, changes.width, changes.height| GL_RGBA, GL_UNSIGNED_BYTE, data); } }*/ // changes.setRect(0,0,0,0); }
der hier auskommentierte bereich betraf die verwendung von glTexSubImage2D
Aber es wurde immer nur ein Verzertes bild gezeigt... wenn ich ein rechteck von genau 256 px breite upgedated hab, dann konnte man sehen, dass er immer wieder bei 0 anfägt, also bei glTexSubImage2D data als neue textur anerkennt...hoffe ihr wisst ws ich meine
-
man könnte ja mal google nach "render to texture" bemühen.
[edit="rapso"]flame weggekürzt[/edit]
-
Ahvolon[F-Bytes] schrieb:
...
wenn du einen anderen Weg kennst, dann könntest du dich ja mal bemühen, ihn in dem shadowmap-thread von mir darzustellen.
[edit="rapso"]flame gekürzt[/edit]
-
Du hast ja ...
..
*SCNR*
[edit="rapso"]flame gekürzt[/edit]
-
spl@t schrieb:
wenn du einen anderen Weg kennst, dann könntest du dich ja mal bemühen, ihn in dem shadowmap-thread von mir darzustellen.
Dir zu sagen, nach was du bei google suchen musst sollte doch ausreichend sein. Schau bei der Dev Sektion von nVidia. Die haben gute papers, die dir erläutern
[edit="rapso"]flame entfernt[/url]
-
Finde da nur was über pbuffers. Aber die nehmen viele ja nicht, weil's hässlich und umständlich ist.
Aber danke für den Hinweis, in dem Paper wirds Schritt für Schritt aufgezeigt und somit ist es vielleicht doch mal einen Blick wert.
-
Ich meinte auch besonders die Auswertungen und Vergleiche der verschiedenen Methoden. Sehr lustig alles.