Hi!
Ich habe ein - wahrscheinlich nicht ganz alltägliches - OpenGL-Problem:
Mit Hilfe von mach_star patche ich eine spezielle Funktion (CGLFlushDrawable) in OpenGL-Anwendungen (Spielen), um eigene Sachen über den aktuellen Bildinhalt zu zeichnen.
Wen da nähere Details interessieren, hier die Projektseite, tut aber denke ich nichts zur Sache.
Bei vielen Spielen funktioniert das auch sehr gut und einwandfrei. Bei anderen - als Beispiel sei hier Angry Birds Rio genannt - bekomme ich nach dem Laden einer Textur Grafikfehler im Spiel. In diesem Beispiel wird der Cursor statt einer Hand zu einem weißen Rechteck. Das ganze passiert direkt beim Laden der Textur, unabhängig davon, ob ich sie tatsächlich zeichne oder nicht.
Konkret sieht mein Code zum Laden der Textur wie folgt aus:
Alles anzeigen
In dieser Funktion habe ich den Übeltäter auch schon identifiziert. Wider erwarten ist es nicht das Binden der Textur oder Setzen der Texturparameter, sondern das eigentliche Generieren der Textur:
Ich bin jetzt nicht so der OpenGL-Guru, aber das ist ja schon eine sehr grundlegende Funktion, und ich sehe nicht wo ich da was falsch machen könnte... Denke ich bin mir nicht so ganz bewusst, was da intern eigentlich genau passiert...
Kommentiere ich o.g. Zeile aus, läuft alles wunderbar - nur eben ohne meine Textur.
Die Verwundung von gluBuild2DMipmaps statt glTexImage2D ändert nichts, genauso wie das setzen auf die vorher gebundene Textur oder das Wechseln der TextureUnit.
Was mich dabei stutzig macht: Zum Zeichnen von Text benutze ich die Klasse GLString aus einem Apple Beispielcode. Die verwenden da zum internen Generieren der Textur ebenfalls glTexImage2D, was keinerlei Probleme verursacht.
So... Ich hoffe mal einer von euch hat einen Tipp, wie ich eine Textur aus einem .jpg (oder was auch immer) generieren kann ohne die aktuelle OpenGL-Darstellung zu verunstalten. Kann ja eigentlich nicht so schwer sein, bestimmt mach ich einfach was grundlegendes falsch...
Naja, danke Euch schon mal für die Hilfe!
Ich habe ein - wahrscheinlich nicht ganz alltägliches - OpenGL-Problem:
Mit Hilfe von mach_star patche ich eine spezielle Funktion (CGLFlushDrawable) in OpenGL-Anwendungen (Spielen), um eigene Sachen über den aktuellen Bildinhalt zu zeichnen.
Wen da nähere Details interessieren, hier die Projektseite, tut aber denke ich nichts zur Sache.
Bei vielen Spielen funktioniert das auch sehr gut und einwandfrei. Bei anderen - als Beispiel sei hier Angry Birds Rio genannt - bekomme ich nach dem Laden einer Textur Grafikfehler im Spiel. In diesem Beispiel wird der Cursor statt einer Hand zu einem weißen Rechteck. Das ganze passiert direkt beim Laden der Textur, unabhängig davon, ob ich sie tatsächlich zeichne oder nicht.
Konkret sieht mein Code zum Laden der Textur wie folgt aus:
Quellcode
- GLuint LoadTexture(NSString* file)
- {
- GLuint mytex=0;
- GLsizei width, height;
- BOOL hasAlpha;
- GLenum format;
- unsigned char* bitmapData;
- NSImage *texture1 = [[NSImage alloc] initWithContentsOfFile:file];
- if (texture1) {
- NSBitmapImageRep *imageRep = (NSBitmapImageRep *)[texture1 bestRepresentationForDevice:nil];
- glGenTextures( 1, &mytex );
- glBindTexture( GL_TEXTURE_2D, mytex );
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
- width = [imageRep pixelsWide];
- height = [imageRep pixelsHigh];
- hasAlpha = [imageRep hasAlpha];
- bitmapData = [imageRep bitmapData];
- if(hasAlpha) {
- format = GL_RGBA;
- } else {
- format = GL_RGB;
- }
- // gluBuild2DMipmaps(GL_TEXTURE_2D, format, width, height, format, GL_UNSIGNED_BYTE, bitmapData);
- glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, format, GL_UNSIGNED_BYTE, bitmapData);
- // glBindTexture( GL_TEXTURE_2D, 0);
- }
- [texture1 release];
- return mytex;
- }
In dieser Funktion habe ich den Übeltäter auch schon identifiziert. Wider erwarten ist es nicht das Binden der Textur oder Setzen der Texturparameter, sondern das eigentliche Generieren der Textur:
Ich bin jetzt nicht so der OpenGL-Guru, aber das ist ja schon eine sehr grundlegende Funktion, und ich sehe nicht wo ich da was falsch machen könnte... Denke ich bin mir nicht so ganz bewusst, was da intern eigentlich genau passiert...
Kommentiere ich o.g. Zeile aus, läuft alles wunderbar - nur eben ohne meine Textur.
Die Verwundung von gluBuild2DMipmaps statt glTexImage2D ändert nichts, genauso wie das setzen auf die vorher gebundene Textur oder das Wechseln der TextureUnit.Was mich dabei stutzig macht: Zum Zeichnen von Text benutze ich die Klasse GLString aus einem Apple Beispielcode. Die verwenden da zum internen Generieren der Textur ebenfalls glTexImage2D, was keinerlei Probleme verursacht.
So... Ich hoffe mal einer von euch hat einen Tipp, wie ich eine Textur aus einem .jpg (oder was auch immer) generieren kann ohne die aktuelle OpenGL-Darstellung zu verunstalten. Kann ja eigentlich nicht so schwer sein, bestimmt mach ich einfach was grundlegendes falsch...
Naja, danke Euch schon mal für die Hilfe!
Dummerweise verabschiedet es sich beim Start mit der Meldung, dass mein OS nicht unterstützt wird. Danke, Lion...