[OpenGL] Texturieren von Quadrics



  • Hallo alle zusammen!

    Ich habe mich bisher immer davor gedrückt mich in dem Forum anzumelden, jetzt komm ich ohne eure Hilfe nicht mehr drumherum.

    Ich muss in OpenGL zwei Kugeln (Quadrics - Sphere) erstellen und diese einmal mit einer Schachbretttexture versehen, die "nur" als Funktion vorliegt und die andere soll eine Bitmap schick machen.

    Meine Kugel will einfach nicht die Textur annehmen. Ich schick euch mal den Code.

    static void GLUTCALLBACK initRendering(void)
    {
    
        GLUquadricObj *qobj;
    
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
    //    glClearColor (0.0,0.0,0.0,0.0);
        glClearColor (0.7,0.7,0.7,1.0);
        glEnable(GL_DEPTH_TEST);
    //    glEnable(GL_LIGHTING);
    //    glEnable(GL_LIGHT0);
        glShadeModel(GL_SMOOTH);
    
        glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, yellow);
        glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, shini);
    
    	glLightfv(GL_LIGHT0,GL_AMBIENT,grey);
    	glLightfv(GL_LIGHT0,GL_DIFFUSE,white);
    	glLightfv(GL_LIGHT0,GL_SPECULAR,yellow);
    	glLightfv(GL_LIGHT0,GL_POSITION,postition);
    	glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, spot_direction);
    
        coords = 1;
        glNewList(coords,GL_COMPILE);
    		glLineWidth(1);
    		glBegin(GL_LINES);
        		glColor3f(1,0,0);
        		glVertex3f(0,0,0);
        		glVertex3f(5,0,0);
    
        	glEnd();
        	glBegin(GL_LINES);
        		glColor3f(0.0,1.0,0.0);
        		glVertex3f(0,0,0);
        		glVertex3f(0,5,0);
    
        	glEnd();
        	glBegin(GL_LINES);
        		glColor3f(0,0,1);
        		glVertex3f(0,0,0);
        		glVertex3f(0,0,5);
    
        	glEnd();
    	glEndList();
    
    	texture = 4;
    	glNewList(texture, GL_COMPILE);
    		glGenTextures(1, &checkTexture);
    		glBindTexture(GL_TEXTURE_2D,checkTexture);
    		makeCheckImage();
    		glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,64,64,0,GL_RGBA,GL_UNSIGNED_BYTE, checkImage);
    		glTexEnvf(GL_TEXTURE_ENV ,GL_TEXTURE_ENV_MODE,GL_DECAL);
    	glEndList();
    
    	qobj=gluNewQuadric();
    	gluQuadricDrawStyle(qobj,GLU_FILL);
    	sphere1 = 2;
    	glNewList(sphere1, GL_COMPILE);
    		gluQuadricTexture(qobj, GL_TRUE);
    		glTranslatef(-0.5f, 0.0f, -0.5f);
    		glMaterialfv(GL_FRONT,GL_DIFFUSE,green);
    		//glShadeModel(GL_LINE);
    		gluSphere(qobj,0.3,16,16);
    
    	glEndList();
    	gluDeleteQuadric(qobj);
    
    	qobj=gluNewQuadric();
    	gluQuadricDrawStyle(qobj,GLU_FILL);
    	sphere2 = 3;
    	glNewList(sphere2, GL_COMPILE);
    		glTranslatef(1.0f, 0.0f, 1.0f);
    		glMaterialfv(GL_FRONT,GL_DIFFUSE,blue);
    		glShadeModel(GL_SMOOTH);
    		gluSphere(qobj,0.3,16,16);
    	glEndList();
    	gluDeleteQuadric(qobj);
    
    }
    

    aufgerufen wird das ganze dann so:

    static void GLUTCALLBACK renderScene(void)
    {
    	/* Creating the Scene */
    		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    	    glColor3f(0,0,0);		  /* White */
    
    	    glMatrixMode(GL_MODELVIEW);
    		glLoadIdentity();
    ...
    	    glCallList(coords);
    	    glEnable(GL_TEXTURE_2D);
    	    glCallList(texture);
    	    glCallList(sphere1);
    	    glDisable(GL_TEXTURE_2D);
    	    //glCallList(sphere2);
    	    glutSwapBuffers();
    

    und hier noch die Funktion für die Erstellung der checkImage

    void makeCheckImage(void) {
      int i, j, c;
      for (i=0; i < checkImageHeight; i++) {
        for (j=0; j < checkImageWidth; j++) {
          c = ((((i&0x8)==0)^(((j&0x8))==0) ))*255;
          checkImage[i][j][0] = (GLubyte) c;	/* R */
          checkImage[i][j][1] = (GLubyte) c;	/* G */
          checkImage[i][j][2] = (GLubyte) c;	/* B */
          checkImage[i][j][3] = (GLubyte) 255;	/* Alpha */
        }
      }
    }
    

    Passieren tut nix, opengl "malt" mir nur die Koordinaten und eine Blaue Kugel hin.

    Was habe ich vergessen bzw. übersehen?



  • Du hast die Texturkoordinaten mithilfe von glTextureCoord/i/d/f[v] nicht angegeben beim erstellen der Liste bzw du solltest die hier automatisch erstellen lassen:
    http://jerome.jouvie.free.fr/OpenGl/Tutorials/Tutorial11.php

    Ausserdem musst DU vor der Texturerstellung auch die Textur aktivieren. Und vor dem Aufrufen der Textur diese binden mit glBindTexture(id).
    rya.


Log in to reply