Problem mit Textur Mapping - OpenGL



  • Hi Leute,
    ich hab ein Problem mit dem Textur Mapping. Und zwar möcht ich eine einfache Textur auf eine Kugel zaubern. Klappt nur nicht so richtig. Wiess absolut nicht warum. Hab die Textur nochmal im Verzeichnis überprüft und die BindTexture überarbeitet. Hat vielleicht einer einen Tip ? Am besten ich kopier den Code mal damit ihr mein Problem seht. Danke schonmal im Voraus !

    GLuint texture[1];
    
    AUX_RGBImageRec *LoadBmp(char *Filename)
    {
    	FILE *File=NULL;
    
    	if(!Filename)
    	{
    		MessageBox(NULL,"Konnte Filenamen nicht finden, bitte /ndas Verzeichnis überprüfen !","Error-Filename",MB_OK);
    		return NULL;
    	}
    
    	File=fopen(Filename,"r");
    
    	if(File)
    	{
    		fclose(File);
    		return auxDIBImageLoad (Filename);
    	}
    
    	if(!File)
    	{
    		MessageBox(NULL,"Konnte File aus dem Verzeichnis nicht öffnen !","Fehler-File open",MB_OK);
    		return NULL;
    	}
    
    	return NULL;
    }
    
    int LoadGLTextures()
    {
    	int Status=FALSE;
    	AUX_RGBImageRec *TextureImage[1];
    
    	if(TextureImage[0]=LoadBmp("Data/world.bmp"))
    	{
    		Status=TRUE;
    
    		glGenTextures(1,&texture[0]);
    		glBindTexture(GL_TEXTURE_2D,texture[0]);
    
    		glTexImage2D(GL_TEXTURE_2D,0,3,TextureImage[0]->sizeX,TextureImage[0]->sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,TextureImage[0]->data);
    
    		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
    		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
    		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST_MIPMAP_NEAREST);
    		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST_MIPMAP_NEAREST);
    		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
    		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR_MIPMAP_NEAREST);
    		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST_MIPMAP_LINEAR);
            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST_MIPMAP_LINEAR);
    		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);
    		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR_MIPMAP_LINEAR);
    		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_CLAMP);
    		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_CLAMP);
    		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_REPEAT);
    		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_REPEAT);
    	}
    
    	if(TextureImage[0])
    	{
    		if(TextureImage[0]->data)
    		{
    			free(TextureImage[0]->data);
    		}
    		free(TextureImage[0]);
    	}
    
    	return Status;
    }
    


  • Klappt nur nicht so richtig. Wiess absolut nicht warum.

    bitte praeziser.

    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST_MIPMAP_NEAREST);
            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST_MIPMAP_NEAREST);
            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR_MIPMAP_NEAREST);
            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST_MIPMAP_LINEAR);
            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST_MIPMAP_LINEAR);
            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);
            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR_MIPMAP_LINEAR);
            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_CLAMP);
            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_CLAMP);
            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_REPEAT);
            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_REPEAT);
    

    que pasa?


  • Mod

    pivke schrieb:

    .. Klappt nur nicht so richtig....

    Ist das allerernstes die ganze fehlerbeschriebung die du uns sagen moechtest? ich koennte fast meinen du willst garnicht dass man dir hilft.



  • Nein, es kommt ja eben keine Fehlermeldung ! Aber ein weiterer Code-Teil wo die Kugel texturiert werden sollte :

    void Draw_Sphere()
    {
    	glTranslatef(-15,3,-3);
    	glColor3f(1.0f,1.0f,1.0f);
    	GLUquadric* sphere1;
    	sphere1 = gluNewQuadric();
    	gluQuadricDrawStyle(sphere1, GLU_FILL);
    	gluQuadricNormals(sphere1, GLU_SMOOTH);
    	glBindTexture(GL_TEXTURE_2D, texture[0]);	
    	glEnable(GL_MULTISAMPLE_ARB);
    	gluQuadricTexture(sphere1, 1);
    	gluSphere(sphere1, 3, 100, 100);   
    }
    


  • es kommt ja eben keine Fehlermeldung !

    Eine Fehlerbeschreibung ist gefragt.
    Naja, ich rate unter Abschaetzung Deiner Faehigkeiten einfach mal eine moegliche Fehlerursache:
    Du hast glEnable(GL_TEXTURE_2D) vergessen.



  • Nein, wäre zwar eine schöne Möglichkeit gewesen, ist aber auch nicht der Fehler.



  • Den werden wir auch nicht finden, solange du dich weigerst, eine ausführliche Beschreibung zu geben. 😉



  • Naja, ist ein bischen schwieirg zu erklären, weil es kaum etwas zu erklären gibt.
    Aber ich fang trotzdem mal an :
    Ich hab eigentlich alles richtig gemacht. Ich binde die Textur einfach auf die Kugel, was aber nicht funktioniert. Die Kugel wird einfach nur in der Farbe angezeigt, wie ich sie definiert hab.Scheint so, als wolle er mir die Textur nicht freigeben oder sowas um sie auf die Kugel zu texturieren. glEnable(GL_TEXTURE_2D,texture[0]); ist auch mit drin. Der target, also die Texturart GL_TEXTURE_2D wurde ja bereits freigegeben. Kann mir daher keinen fehler ernennen. Wäre dankbar, wenn mir einer auf die Sprünge helfen könnte ;-).



  • Sorry aber Du schreibst nur wirren Bloedsinn:

    glEnable(GL_TEXTURE_2D,texture[0]);

    Sicherlich nicht...

    Der target, also die Texturart GL_TEXTURE_2D wurde ja bereits freigegeben

    Was?...

    Zur Loesung:
    Du hast wahrscheinlich keine Texturkoordinaten.
    Benutze gluQuadricTexture (edit: hast Du schon, hab ich uebersehen) oder die Generatoren von OpenGL:

    glEnable(GL_TEXTURE_GEN_S);
    glEnable(GL_TEXTURE_GEN_T);
    glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
    glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
    

    Ich bleibe aber auch erstmal bei:

    Du hast glEnable(GL_TEXTURE_2D) vergessen.

    Wie gross ist denn Deine Textur?
    Gibt es irgendwelche Errorcodes?



  • Warum denn auch Texturkoordinaten bei einer Kugel ? Und außerdem hab ich ja gluQuadricTexture benutzt, den Codetiel hab ich doch gepostet :

    void Draw_Sphere()
    {
        glTranslatef(-15,3,-3);
        glColor3f(1.0f,1.0f,1.0f);
        GLUquadric* sphere1;
        sphere1 = gluNewQuadric();
        gluQuadricDrawStyle(sphere1, GLU_FILL);
        gluQuadricNormals(sphere1, GLU_SMOOTH);
        glBindTexture(GL_TEXTURE_2D, texture[0]);   
        glEnable(GL_MULTISAMPLE_ARB);
    
        gluQuadricTexture(sphere1, 1);
    
        gluSphere(sphere1, 3, 100, 100);  
    }
    

    Danke im Voruas.



  • Warum denn auch Texturkoordinaten bei einer Kugel ?

    Wenn Du keine Texturkoordinaten hast, wird (weil OpenGL eine State-Machine ist) fuer jeden Vertex die gleiche (naemlich die zuletzt gesetzte) Texturkoordinate angenommen.
    Das fuehrt dann dazu dass fuer jeden Pixel an der gleichen Stelle aus der Textur gelesen wird, ergo Dein Objekt einfarbig ist.



  • Ja, stimmt, aber für die Koordinaten reicht doch glQuadricTexture oder nicht ?


Anmelden zum Antworten