[gelöst] [Newbiefrage] glTexParameter (oder auch andere) per char übergeben?



  • Hi,

    bin ziemlich neu in der C++ Welt und hab deshalb immer mal wieder noch ziemliche "blöde" Fragen... 😞 Aber jeder fängt ja mal klein an... 😉

    Ich arbeite mich momentan durch die NeHe Tutorials aber da ich mit Xcode auf einem Mac programmiere und zur Bildschirmausgabe OpenGL mit SDL verwende muss ich mir zu den meisten Tutorials noch selbst wieder andere ansehen um alles auf meine Bedürfnisse umzuschreiben, was an sich aber besser klappt wie ich mir das vorher vorgestellt hatte... 🙂 Nun zu meiner Frage, bin sogar sicher (oder hoffe zumindest ich bin nicht der einzige der so ne Frage mal hatte... *gg*) das es sicherlich einige passende Beiträge im Forum gibt, aber wenn man keine Ahnung hat: Wonach suchen? 😃

    Ich habe eine Funktion geschrieben die TGA Dateien ausliest und das ganze dann in einer Struktur ablegt.

    Struktur:

    // Struktur für Texturen
    typedef struct
    {
    	GLubyte	*imageData;	// Daten (bis 32 Bits)
    	GLuint	bpp;		// Farbtiefe in Bits pro Pixel
    	GLuint	width;		// Breite in Pixel
    	GLuint	height;		// Höhe in Pixel
    	GLuint	texID;		// ID
    } TextureImage;
    
    TextureImage	texture[1];			// Platz für * Texturen
    

    Um daraus jetzt eine Texture zu machen habe ich eine Funktion geschrieben die wie folgt aufgerufen wir:

    GenTGATexture( &texture[0], "GL_LINEAR", "GL_LINEAR");
    
    bool GenTGATexture( TextureImage *texture, char const *min, char const *mag)
    {
    	GLuint	type=GL_RGBA;	// Setzt GL Modus auf RGBA (für 32 BPP)
    
    	// Erstellt eine Textur:
    	glGenTextures( 1, &texture->texID);
    	glBindTexture( GL_TEXTURE_2D, texture->texID);
    	glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    	glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    
    	if (texture->bpp==24)
    	{
    	type=GL_RGB;
    	}
    
    	glTexImage2D(GL_TEXTURE_2D, 0, type, texture->width, texture->height, 0, type, GL_UNSIGNED_BYTE, texture->imageData);
    	return true;
    }
    

    Funktioniert auch prima wenn ich GL_LINEAR bei glTexParameteri schreibe. Aber mein eigentlicher gedanke war den Parameter ja via char zu übergeben, so das ich die Funktion auch mit anderen Parametern aufrufen kann. Wenn ich GL_LINEAR aber durch min bzw. mag ersetze bekomme ich immer eine Fehlermeldung das er halt das char nicht umwandeln kann.

    Hoffe es ist verständlich was ich sagen will? 😉 Irgendwas mache ich jedenfalls falsch. Muss mit Sicherheit das char vorher richtig umwandeln, oder? Aber wie? 🙂 Hoffe jemand kann mir da einen kleinen Gedankenanschub geben... 🙂

    Gruß Daniel



  • glTexParameteri() erwartet dort als Parameter einen int (genauer GLint). In den OpenGL Headern ist ein define, das dafür sorgt, dass GL_LINEAR einfach durch eine Zahl ersetzt wird. Deine Zeichenkette passt da dementsprechend nicht rein. Die naheliegenste Lösung wäre deine Funktion auch einen GLint als Parameter zu geben und die Defines zu nutzen.



  • Tobiking2 schrieb:

    glTexParameteri() erwartet dort als Parameter einen int (genauer GLint). In den OpenGL Headern ist ein define, das dafür sorgt, dass GL_LINEAR einfach durch eine Zahl ersetzt wird. Deine Zeichenkette passt da dementsprechend nicht rein. Die naheliegenste Lösung wäre deine Funktion auch einen GLint als Parameter zu geben und die Defines zu nutzen.

    Das hört sich schonmal prima an, jedenfalls wird klar warum's nicht klappt. Ok ich hab mal ein wenig rumgesucht und in der gl.h folgendes gefunden:

    /* TextureMagFilter */
    #define GL_NEAREST                        0x2600
    #define GL_LINEAR                         0x2601
    
    /* TextureMinFilter */
    /*      GL_NEAREST */
    /*      GL_LINEAR */
    #define GL_NEAREST_MIPMAP_NEAREST         0x2700
    #define GL_LINEAR_MIPMAP_NEAREST          0x2701
    #define GL_NEAREST_MIPMAP_LINEAR          0x2702
    #define GL_LINEAR_MIPMAP_LINEAR           0x2703
    

    Ich bin mir jetzt nicht sicher ob ich gecheckt habe was du mir als Lösung vorgeschlagen hast aber es funktioniert jedenfalls wenn ich es so mache:

    GenTGATexture( &texture[0], GL_NEAREST, GL_NEAREST);
    
    bool GenTGATexture( TextureImage *texture, GLfloat min, GLfloat mag)
    {
    	GLuint	type=GL_RGBA;	// Setzt GL Modus auf RGBA (für 32 BPP)
    
    	// Erstellt eine Textur:
    	glGenTextures( 1, &texture->texID);								// Generate OpenGL texture IDs
    	glBindTexture( GL_TEXTURE_2D, texture->texID);
    	glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, min);
    	glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mag);
    
    	if (texture->bpp==24)
    	{
    	type=GL_RGB;
    	}
    
    	glTexImage2D(GL_TEXTURE_2D, 0, type, texture->width, texture->height, 0, type, GL_UNSIGNED_BYTE, texture->imageData);
    	return true;
    }
    

    Falls jemand einen bessern Vorschlag hat, bitte immer her damit... 😃



  • Das ist schon ok so, nur weisst Du auch was GL_LINEAR und GL_NEAREST tun?
    Wenn nicht google es, denn es beeinflusst die Darstellungsqualität.
    lg



  • Genau die Vorgehensweise meinte ich. Ich versteh nur nicht warum du auf die float Variante gewechselt bist. Die verschiedenen Modi sind alle auf Ganzzahlen abgebildet, da sind float eigentlich unpassend. Nen bisschen wundert mich auch das es klappt, aber ich weiß grad nicht wie das genau in der OpenGL Spezifikation festgelegt ist. Kann sein das es dort so auch als möglich angegeben ist.



  • Eigentlich erwartet OpenGL einen GLint für diese Parameter, es wird halt vom Compiler umgewandelt.
    http://wiki.delphigl.com/index.php/glTexImage2D
    char als übergabe zu nehmen geht daher gar nicht, da die Werte eventuell ausm Wertebereich fallen und die Darstellung dann wegen fehlerhafter Parameter nicht erfolgen kann.
    lg



  • L33TF4N schrieb:

    Das ist schon ok so, nur weisst Du auch was GL_LINEAR und GL_NEAREST tun?
    Wenn nicht google es, denn es beeinflusst die Darstellungsqualität.
    lg

    Jepp, die Bedeutung von beidem hab ich hier offen in der Referenz auf http://wiki.delphigl.com/index.php/glTexParameter. Mir ging's jetzt grundsätzlich erstmal darum das ich der Funktion einfach übergebe welchen Filter ich gerne hätte und nicht für jeden eine eigene Funktion schreiben muss. 🙂

    Tobiking2 schrieb:

    Genau die Vorgehensweise meinte ich. Ich versteh nur nicht warum du auf die float Variante gewechselt bist. Die verschiedenen Modi sind alle auf Ganzzahlen abgebildet, da sind float eigentlich unpassend. Nen bisschen wundert mich auch das es klappt, aber ich weiß grad nicht wie das genau in der OpenGL Spezifikation festgelegt ist. Kann sein das es dort so auch als möglich angegeben ist.

    Tja, warum kann ich dir jetzt auch nicht sagen, hab nur gesehen das float und int gehen und da "f"s schöner sind als "i"s... 😉 Ne in der Referenz war zuerst float aufgeführt und dann int, also hab ich mich für float entschieden, ein tieferer Sinn meinerseits war da jedenfalls nicht vorhanden... 😃

    Danke für die schnelle Hilfestellung. 🙂


Anmelden zum Antworten