PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [OpenGL] Render2Texture


Godmode
2009-03-19, 12:53:06
Hi, ich habe ein kleines Problem mit Render2Texture.

Was will ich haben: Ich möchte in eine Textur rendern und diese Textur dann beim nächsten Aufruf meiner Draw-Methode wieder verwenden.

Was habe ich: Beim nächsten Aufruf meiner Draw-Methode ist die Textur leer.

Wenn ich die Textur im selben Aufruf der Draw-Methode (in der die Textur gerendert wird) auf ein Quad zeichne, wird sie angezeigt.

Muss ich etwas beachten damit die Textur nicht gelöscht wird?

Ich verwende übrigens OpenGL ES.

Godmode
2009-03-19, 17:36:57
Ich habe das Problem jetzt selber lösen können.

1. gab es ein Problem mit der Zeichenreihenfolge und der Größe des Viewports.
2. musste die Textur extra initialisiert werden, dh. der Speicher muss manuell allokiert werden. Ich bin davon ausgegangen, dass die Funktion glGenTextures( 1, &txtnumber ) das übernimmt.

- (GLuint) initEmptyTexture
{
GLuint txtnumber; // Texture ID
unsigned int *data; // Stored data
int size = 512;

// calloc() will zero out the memory for us
data = calloc( size * size * 4, sizeof( GLuint ) );

glGenTextures( 1, &txtnumber ); // Create one texture
glBindTexture( GL_TEXTURE_2D, txtnumber );
glTexImage2D( GL_TEXTURE_2D, 0, 4, size, size, 0, GL_RGBA, GL_UNSIGNED_BYTE,
data ); // Build texture using empty buffer
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );

free( data );

return txtnumber;
}

Chris Lux
2009-03-19, 17:39:21
es müsste ein glTexImage(GL_TEXTURE_2D, 0, 4, size, size, 0, GL_RGBA, GL_UNSIGNED_BYTE,
NULL); reichen um den texture speicher zu initalisieren. das spart den temporären speicher.

Godmode
2009-03-19, 17:48:53
es müsste ein glTexImage(GL_TEXTURE_2D, 0, 4, size, size, 0, GL_RGBA, GL_UNSIGNED_BYTE,
NULL); reichen um den texture speicher zu initalisieren. das spart den temporären speicher.

Danke für den Tipp! Das funktioniert ja wirklich. :)

Godmode
2009-03-21, 23:12:10
Ich hätte jetzt noch eine Frage: Wie performant ist diese Methode eigentlich? Ich habe herausgefunden, dass ca. 20% der CPU-Zeit mit Render2Texture verbraten wird?

Markus89
2009-03-22, 12:39:29
Ich weiß nicht genau, wie schnell oder langsam glCopyTexImage ist, aber normalerweise verwendet man zum Offscreenrendering FrameBufferObjects. ABer ich kann dir keine Garantie geben, dass FBOs im Endeffekt schneller sind.

Godmode
2009-03-23, 02:22:41
Ok danke, hab ich auch schon wo gelesen! Ich hab jetzt eine kleine Verbesserung implementiert und das Problem damit behoben.

Ich rufe render2tex nur mehr auf, wenn etwas verändert wurde, somit spare ich viel Rechenleistung ein.