Wai Hein
Wai Hein

Reputation: 69

background texture. Switch to ortho and then switch back to 3d

I am working on a background texture. What I want to do is that I want to set a background image. For that in my code I used switch to ortho, draw a square full of window size, texture it. Then switch back to 3d and draw 3d images. It draw the background texture and snowman but they all disappear in a sec. I have no idea where the error code is. gotta have something to do with pushing and popping the matrix I think. Below is the code of my InitGl, draw() and drawsnowman(), main and reshape(). I think the problem is in draw() function during the swithc between 3D to 2d. Advice?

int main (int argc, char **argv) 
{
     glutInit (&argc, argv);
     glutInitDisplayMode (GLUT_DOUBLE);
     glutInitWindowSize (500, 500);
     glutInitWindowPosition (100, 100);
     glutCreateWindow ("A basic OpenGL Window");
     glutKeyboardFunc(key);

     if( !initGL() ) {                                                   // NEW (16)
        printf( "Unable to initialize graphics library!\n" );
        return 1;
    }

     glutDisplayFunc (display);
    // glutIdleFunc (display);
    glutIdleFunc(idle);
     glutReshapeFunc (reshape);

    //Load our texture
     texture = LoadTexture( "texture.bmp", 256, 256 );

    glutMainLoop ();

    //Free our texture
     FreeTexture( texture );

    return 0;
 }


void drawSnowMan(void)
{
    GLUquadricObj *pObj;
    //glDisable(GL_TEXTURE_2D);
    glEnable(GL_CULL_FACE);
    glCullFace(GL_BACK);

    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);

// save the world matrix
    glPushMatrix();

        glTranslatef(xpos, -0.5, -5.0);
        glRotated(rotX,1,0,0);                             // ******** NEW (11)
        glRotated(rotY,0,1,0);
        pObj = gluNewQuadric();
        gluQuadricNormals(pObj, GLU_SMOOTH);
    //glRotated(rotZ,0,0,1);

    glPushMatrix();
        //setting up light effect for base, mid and head spheres. all red!
        ambient[0] = 1.0; ambient[1] = 0.0; ambient[2] = 0.0;
        diffuse[0] = 1.0; diffuse[1] = 0.0; diffuse[2] = 0.0;
        specular[0] = 0.7; specular[1] = 0.6; specular[2] = 0.5;
        glMaterialfv(GL_FRONT, GL_AMBIENT, ambient);
        glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse);
        glMaterialfv(GL_FRONT, GL_SPECULAR, specular);
        glMaterialfv(GL_FRONT, GL_SHININESS, shiness);

        glEnable(GL_LIGHTING);
        glEnable(GL_LIGHT0);
        //glTranslatef(0.0 ,0.75f, 0.0f);
        //bottom sphere. dont need to gltranslate again because it will use the previous gltranslate
        //which is declared outside
        glutSolidSphere(0.70f,20,20);

        //mid sphere
        glTranslatef(0.0f, 1.0f, 0.0f);
        glutSolidSphere(0.45f,20,20);

        //top sphere
        glTranslatef(0.0f, 0.6f, 0.0f);
        glutSolidSphere(0.30f,20,20);

        //eyes

    glDisable(GL_LIGHTING);
    glDisable(GL_LIGHT0);
    glPopMatrix();

    //drawing hat
    glPushMatrix();
            //black color. move it 1.85 in y position because thats where the head is
            //rotate the cylinder and draw cylinder
            glColor3f(0.0f, 0.0f, 0.0f);
            glTranslatef(0.0f, 1.85f, 0.0f);
            glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);
            gluCylinder(pObj, 0.17f, 0.17f, 0.4f, 26, 13);

            //drawing brim. disable cull_face. draw disk, so front part. disabl
             glDisable(GL_CULL_FACE);
            gluDisk(pObj, 0.17f, 0.28f, 26, 13);
            glEnable(GL_CULL_FACE);


            glTranslatef(0.0f, 0.0f, 0.40f);
             gluDisk(pObj, 0.17f, 0.28f, 26, 13);
    glPopMatrix();

    glPushMatrix();

        glPushMatrix();
        glColor3f(1.0,1.0,1.0);
        glTranslatef(2.0f, 1.0f, 0.0f);
        glRotatef(90.0,0.0, 0.0,-5.0);
        glScalef (0.01, 0.2, 0.06);      /* modeling transformation */
        //glutSolidCone(0.1, 0.1, 10.0, 14.0);
        glutSolidCube(1.5);

        glPopMatrix();

        glPushMatrix();

        glTranslatef(2.0f, 0.8f, 0.0f);
        glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);
        gluCylinder(pObj, 0.04f, 0.04f, 0.2f, 26, 13);

        glPopMatrix();

        //blade
        glPushMatrix();
            ambient[0] = 0.0; ambient[1] = 1.0; ambient[2] = 0.0;
            diffuse[0] = 1.0; diffuse[1] = 0.0; diffuse[2] = 0.0;
            specular[0] = 0.7; specular[1] = 0.6; specular[2] = 0.5;
            glMaterialfv(GL_FRONT, GL_AMBIENT, ambient);
            glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse);
            glMaterialfv(GL_FRONT, GL_SPECULAR, specular);
            glMaterialfv(GL_FRONT, GL_SHININESS, shiness);

            glEnable(GL_LIGHTING);
            glEnable(GL_LIGHT1);

            glTranslatef(2.0f, 1.0f, 0.0f);
            glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);
            gluCylinder(pObj, 0.03f, 0.03f, 1.1f, 26, 13);

            glDisable(GL_LIGHTING);
            glDisable(GL_LIGHT0);
        glPopMatrix();

    glPopMatrix();

    //big push matrix for eyes, and nose
    glPushMatrix();
        //eyes color = black light. set defuse all 0, ambient = black. turns the eyes black
        /*ambient[0] = 0.0; ambient[1] = 0.0; ambient[2] = 0.0;
        diffuse[0] = 0.0; diffuse[1] = 0.0; diffuse[2] = 0.0;
        specular[0] = 0.7; specular[1] = 0.6; specular[2] = 0.5;
        glMaterialfv(GL_FRONT, GL_AMBIENT, ambient);
        glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse);
        glMaterialfv(GL_FRONT, GL_SPECULAR, specular);
        glMaterialfv(GL_FRONT, GL_SHININESS, shiness);*/

        glColor3f(0.0, 0.0, 0.0);

        //left eye
        glPushMatrix();
            glTranslatef(-0.17, 1.7, 0.25 );
            glutSolidSphere(0.05, 10.0, 10.0);
        glPopMatrix();

        //right eye
        glPushMatrix();
            glTranslatef(0.17, 1.7, 0.25 );
            glutSolidSphere(0.05, 10.0, 10.0);
        glPopMatrix();

        //drawing nose
        glPushMatrix();
            glTranslatef(0.0, 1.6, 0.25 );
            glutSolidCone(0.08f,0.5f,10,2);
        glPopMatrix();

    glPopMatrix(); // end big push matrix for eyes and nose


glPopMatrix();

} // end of drawsnowman()


void display (void) {
     glClearColor(0.25f, 0.25f, 0.50f, 1.0f ); // blueish color
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
   // glLoadIdentity();

    // MODEL VIEW is set up in IniitGL
    //so save it
    glPushMatrix();
            //switch to projection matrix
            //swithc to ortho.
            //draw texture
         glMatrixMode(GL_PROJECTION);
         glLoadIdentity();
         glOrtho(0.0, 1.0, 0.0, 1.0, 0.0, -1.0);
         glDisable(GL_DEPTH_TEST);
         glDisable(GL_LIGHTING);
         glDepthMask(GL_FALSE);
         glMatrixMode(GL_MODELVIEW);
         glLoadIdentity();

         glEnable(GL_TEXTURE_2D);
         glBindTexture(GL_TEXTURE_2D, texture);


// Draw a textured quad
        glBegin(GL_QUADS);
        glTexCoord2f(0, 0); glVertex3f(0, 0, 0);
        glTexCoord2f(0, 1); glVertex3f(0, 1, 0);
        glTexCoord2f(1, 1); glVertex3f(1, 1, 0);
        glTexCoord2f(1, 0); glVertex3f(1, 0, 0);
        glEnd();


        glDepthMask(GL_TRUE);
        glEnable(GL_DEPTH_TEST);

    glPopMatrix();// pop the 3d model view
    glMatrixMode(GL_PROJECTION);
        glMatrixMode(GL_MODELVIEW);


// You can ignore this. just a different of way drawing texture and still does not work
   /* glMatrixMode(GL_PROJECTION);
    glPushMatrix();
    glLoadIdentity();
    glOrtho(0.0, 1.0, 0.0, 1.0, 0.0, -1.0);


    glDisable(GL_DEPTH_TEST);
 glDisable(GL_LIGHTING);
 glDepthMask(GL_FALSE);
    glMatrixMode(GL_MODELVIEW);


   glPushMatrix();

   glDepthMask( false );
    glLoadIdentity();


    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, texture);


// Draw a textured quad
    glBegin(GL_QUADS);
    glTexCoord2f(0, 0); glVertex3f(0, 0, 0);
    glTexCoord2f(0, 1); glVertex3f(0, 1, 0);
    glTexCoord2f(1, 1); glVertex3f(1, 1, 0);
    glTexCoord2f(1, 0); glVertex3f(1, 0, 0);
    glEnd();


    glDepthMask(GL_TRUE);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_LIGHTING);
    /*glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective (60, 800 / 600, 1.0, 100.0);;
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(  0.0, 0.0, 0.0,  // Where would the camera be?
                0.0, 0.0,-1.0,  // Where would it be looking?
                0.0, 1.0, 0.0); // What would be the "up" vector?fa*/


   /* glDisable(GL_TEXTURE_2D);
    glPopMatrix();
    glMatrixMode(GL_PROJECTION);
    glPopMatrix();
    //gluPerspective (45, SCREEN_WIDTH / SCREEN_HEIGHT, 1.0, 100.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();*/

      drawSnowMan(); // draw snow man


     glutSwapBuffers();
     angle ++;
 }

 void reshape (int w, int h) {
     glViewport (0, 0, (GLsizei)w, (GLsizei)h);
     glMatrixMode (GL_PROJECTION);
     glLoadIdentity ();
     gluPerspective (45, (GLfloat)w / (GLfloat)h, 1.0, 100.0);
     glMatrixMode (GL_MODELVIEW);
 }

bool initGL (void) {

    glViewport(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);

    // Switch to the "camera" mode
    glMatrixMode(GL_PROJECTION);  // Camera
    glLoadIdentity();

    // Change the camera to a 3D view
    glFrustum( -1 * (float) SCREEN_WIDTH / SCREEN_HEIGHT,
                    (float) SCREEN_WIDTH / SCREEN_HEIGHT,
                    -1.0,
                     1.0,
                     1.5,
                     1000.0);

   glClearColor(0.25f, 0.25f, 0.50f, 1.0f );

    glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);                         // NEW (5)
    glEnable(GL_LINE_SMOOTH);                                       // NEW (6)

    glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);                      // NEW (7)
    glEnable(GL_POLYGON_SMOOTH);                                    // NEW (8)

    // this is a specular light
    GLfloat mat_specular[] = { 1.0 , 1.0 , 1.0 , 1.0 };    // Color of a "shiny material
    GLfloat mat_shininess[] = { 50.0 };                 // How shiny is it?
   // GLfloat mat_ambient_and_diffuse[] = { 0.0, 1.0, 0.0, 1.0 };

    GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };  // Infinitely far away. Direction light
    GLfloat light_position1[] = {2.0,1.5,0.0,1.0}; // saber light


    // How to calculate the surface normal for pixels
    glShadeModel(GL_SMOOTH); // Try this as well GL_FLAT

    // Setup up some material reflective properties
   // glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
   // glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
    //glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient_and_diffuse);
    //glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_ambient_and_diffuse);

    // Finally actually make the light
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
    glLightfv(GL_LIGHT1, GL_POSITION, light_position1);

    //Check for error
    GLenum error = glGetError();                                    // NEW (9)
    if( error != GL_NO_ERROR ) {
        printf( "Error initializing OpenGL! %s\n", gluErrorString( error ) );
        return false;
    }

    return true;
}

void idle(void) {
    glutPostRedisplay();
}

Upvotes: 0

Views: 649

Answers (2)

Wai Hein
Wai Hein

Reputation: 69

I think I kinda figure out why my background texture keep disappearing. I had Cullface and depth something turned on. I turned it off befor popping the last matrix and it works.

However, there is one problem. The texture image is snowy background, but it turns into all red. So first I thought it was due to the reflection of the lighting from the snowgirl. I turned off all the light and still red. Can't figure out why. Could it be, the texture color blending in with the original color of the snowman?

Upvotes: 0

datenwolf
datenwolf

Reputation: 162297

Reoccuring newbie misconception: OpenGL "initialization".

OpenGL is not initialized! All the code you have in initGL and reshape belongs into display.

In the case of calls glLight… those must be placed in display, after setting the modelview matrix into the space you want the lights to be in. Also OpenGL is not a library; yes originally the 'L' in OpenGL did mean library, but I backronymed it to Layer, because that's what it is on most modern graphics systems: A layer between a end user program and the GPU and its drivers.

I think once you moved the code from initGL and reshape to display, the solution should become clear: You can change, reset and modify the projection and modelview matrix whenever you like. To have the window width and height available in display either store them in global variables in reshape, or, the preferred solution, use glutGet(GLUT_WINDOW_WIDTH) and glutGet(GLUT_WINDOW_HEIGHT) to query the window dimensions in the display function.

You want to draw things in a orthographic projection? Then setup projection and modelview appropriately. Switching to a perspective? Just do it.

Upvotes: 1

Related Questions