Multiple windows in OpenGL?

前端 未结 5 1113
暗喜
暗喜 2021-02-06 02:53

Is it possible to have openGL in 2 windows? as in 2 different windows (lets say the first is 640x480 and the other is 1024x768) rendering different things (lets say one window i

相关标签:
5条回答
  • 2021-02-06 03:04

    If you're using GLUT you can use the glutSetWindow() / glutGetWindow() calls to select the correct window (after creating them with glutCreateSubWindow()). However sometimes GLUT might not be the right tool for the job.

    If you're working on Windows you'll want to look into the wglMakeCurrent() and wglCreateContext(). On OS X there is aglSetCurrentContext() et cetera, and X11 requires glXMakeCurrent().

    Those functions activate the current OpenGL context to which you can render. Each platform specific library has it's own ways of creating a window and binding an OpenGL context to it.

    On Windows, after you've acquired your HWND and HDC for a window (after a CreateWindow and GetDC call). You generally do something like this to set up OpenGL:

    GLuint l_PixelFormat = 0;
    
    // some pixel format descriptor that I generally use:
    static PIXELFORMATDESCRIPTOR l_Pfd = { sizeof(PIXELFORMATDESCRIPTOR), 1, 
        PFD_DRAW_TO_WINDOW + PFD_SUPPORT_OPENGL + PFD_DOUBLEBUFFER, 
        PFD_TYPE_RGBA, m_BitsPerPixel, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 16, 0, 0, PFD_MAIN_PLANE, 0, 0, 0, 0};
    
    if(!(l_PixelFormat = ChoosePixelFormat(m_hDC, &l_Pfd))){
        throw std::runtime_error("No matching pixel format descriptor");
    }
    
    if(!SetPixelFormat(m_hDC, l_PixelFormat, &l_Pfd)){
        throw std::runtime_error("Can't set the pixel format");
    }
    
    if(!(m_hRC = wglCreateContext(m_hDC))){
        throw std::runtime_error("Can't create rendering context");
    }
    
    wglMakeCurrent(m_hDC, m_hRC);
    

    You use that code to create multiple windows and bind OpenGL to it, then each time you want to draw to a specific window you have to call wglMakeCurrent before you do anything and you pass in the parameters corresponding to that window.

    As a side-note, OpenGL allows you to share certain data between different contexts, however as per spec the data that you can share is pretty limited. However, most OSes allow you to share more data than specified in the specification.

    0 讨论(0)
  • 2021-02-06 03:09

    I've done multiple OpenGL windows in an MFC application before. Here's a class you might find useful: since there can only be one current render context in the UI thread at a time, I wrote a class wrapper to make managing it easier.

    SaveRestoreRC.h

    // this class helps to manage multiple RCs using an RAII design pattern

    class CSaveRestoreRC
    {
    public:
    HDC   oldDC;            
    HGLRC oldRC;            
    
    CSaveRestoreRC(HDC hDC, HGLRC hRC);
    ~CSaveRestoreRC(void);
    };
    

    SaveRestoreRC.cpp:

    CSaveRestoreRC::CSaveRestoreRC(HDC hDC, HGLRC hRC)
    {
    ASSERT( hDC );
    ASSERT( hRC );
    
    oldDC = wglGetCurrentDC();
    oldRC = wglGetCurrentContext();
    
    BOOL result = wglMakeCurrent( hDC, hRC );
    ASSERT( result );
    }
    
    CSaveRestoreRC::~CSaveRestoreRC(void)
    {
    if( !oldRC )
        return;
    ASSERT( oldDC );
    BOOL result = wglMakeCurrent( oldDC, oldRC );
    ASSERT( result );    
    }
    

    Now derive a class from CWnd and add these member variables:

    class COpenGLControl : public CWnd
    {
        // used to interface OpenGL with Windows
        HDC   hdc;          
        HGLRC hrc;          
    // ...
    
    int COpenGLControl::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    if (CWnd::OnCreate(lpCreateStruct) == -1)
        return -1;
    // Get device context only once.
    hdc = GetDC()->m_hDC;
    
    // ... ChoosePixelFormat, SetPixelFormat, etc. here.
    
    // Create the OpenGL Rendering Context.
    hrc = wglCreateContext(hdc);
    ASSERT( hrc );
    

    Then in every member function where you call ANY OpenGL commands, use CSaveRestoreRC so that your current render context doesn't get screwed up.

    void COpenGLControl::UpdateCamera()
    {
    CSaveRestoreRC c(hdc, hrc);
    
    // Map the OpenGL device coordinates.
    glViewport(0, 0, renderingWindow.Width(), renderingWindow.Height());
    
    // Do your other OpenGL stuff here
    // ... 
    
    // the CSaveRestoreRC destructor will automatically put the correct render context back, 
    // even if you call other functions. Of course, put another CSaveRestoreRC there too.
    } 
    

    0 讨论(0)
  • 2021-02-06 03:14

    Yes, this is possible. For each window you will need to create a unique device context and render context.

    HDC hDC = GetDC( hWnd ); /* get the device context for a particular window */
    /* snip */
    HGLRC hRC;
    hRC = wglCreateContext( hDC ); /* get a render context for the same window */
    /* repeat with hDC2 and hRC2 with another window handle*/
    

    Before making GL calls to the window you must call wglMakeCurrent like this:

    wglMakeCurrent( hDC, hRC );
    /* GL calls for first window */
    wglMakeCurrent( NULL, NULL);
    
    wglMakeCurrent( hDC2, hRC2 );
    /* GL calls for second window */
    wglMakeCurrent( NULL, NULL);
    
    0 讨论(0)
  • 2021-02-06 03:14

    On Windows you can share OpenGL objects such as textures and shaders with wglShareLists(). It typically does share everything you'd care about, despite what MSDN says.

    0 讨论(0)
  • 2021-02-06 03:19

    If you like using only glut library, please look a code by Eric Stringer.

    // Glutdualwindow.c
    // By Eric Stringer 2002
    // Simple examples of OpenGL and Glut usage.
    // Keyboard input
    // 'v' = view ortho/perspective
    // 'l' = lighting on/off
    
    
    #include <windows.h>  // This header file will be needed for some windows compilers
    //#include <GL/gl.h>   // gl.h and glu.h also maybe needed for some compilers
    //#include <GL/glu.h>
    #include <GL/glut.h>  // glut (gl utility toolkit) basic windows functions, keyboard, mouse.
    #include <stdio.h>    // standard (I/O library)
    #include <stdlib.h>   // standard library (set of standard C functions
    #include <math.h>     // Math library (Higher math functions )
    
    
    // lighting
    GLfloat LightAmbient[]= { 0.2f, 0.2f, 0.2f, 1.0f };
    GLfloat LightDiffuse[]= { 0.5f, 0.5f, 0.5f, 1.0f };
    GLfloat LightPosition[]= { 5.0f, 5.0f, -10.0f, 1.0f };
    GLfloat mat_specular[] = { 0.2, 0.2, 0.2, 1.0 };
    
    int window_1, window_2;
    
    static int view_state = 0, light_state = 0;
    
    int spin;
    
    int shape;
    
    // I use this to put text on the screen
    void Sprint( int x, int y, char *st)
    {
        int l,i;
    
        l=strlen( st ); // see how many characters are in text string.
        glRasterPos2i( x, y); // location to start printing text
        for( i=0; i < l; i++)  // loop until i is greater then l
            {
            glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, st[i]); // Print a character on the screen
        }
    
    }
    
    
    // This creates the spinning of the cube.
    static void TimeEvent(int te)
    {
    
        spin++;  // increase cube rotation by 1
        if (spin > 360) spin = 0; // if over 360 degress, start back at zero.
    
        glutSetWindow( window_1 );
        glutPostRedisplay();  // Update screen with new rotation data
    
        glutSetWindow( window_2 );
        glutPostRedisplay();  // Update screen with new rotation data
    
        glutTimerFunc( 100, TimeEvent, 1);  // Reset our timmer.
    }
    
    
    // Setup our Opengl world, called once at startup.
    void init(void)
    {
    
    
       glClearColor (0.0, 0.0, 0.0, 0.0);  // When screen cleared, use black.
       glShadeModel (GL_SMOOTH);  // How the object color will be rendered smooth or flat
       glEnable(GL_DEPTH_TEST);   // Check depth when rendering
       // Lighting is added to scene
       glLightfv(GL_LIGHT1 ,GL_AMBIENT, LightAmbient);
       glLightfv(GL_LIGHT1 ,GL_DIFFUSE, LightDiffuse);
       glLightfv(GL_LIGHT1 ,GL_POSITION, LightPosition);
       glEnable(GL_LIGHTING);  // Turn on lighting
       glEnable(GL_LIGHT1);    // Turn on light 1
    
    
    }
    
    
    // Draw our world
    void display_1(void)
    {
    char *p;
    
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  //Clear the screen
    
    glMatrixMode (GL_PROJECTION);  // Tell opengl that we are doing project matrix work
    glLoadIdentity();  // Clear the matrix
    glOrtho(-8.0, 8.0, -8.0, 8.0, 0.0, 30.0);  // Setup an Ortho view
    glMatrixMode(GL_MODELVIEW);  // Tell opengl that we are doing model matrix work. (drawing)
    glLoadIdentity(); // Clear the model matrix
    
    
    glColor3f(1.0, 1.0, 1.0);
    if (shape == 0) Sprint(-3, -7 ,"Solid Cube");
    if (shape == 1) Sprint(-3, -7 ,"Solid Cone");
    if (shape == 2) Sprint(-3, -7 ,"Solid Sphere");
    if (shape == 3) Sprint(-3, -7 ,"Solid Torus");
    if (shape == 4) Sprint(-3, -7 ,"Solid Dodecahedron");
    if (shape == 5) Sprint(-3, -7 ,"Solid Octahedron");
    if (shape == 6) Sprint(-3, -7 ,"Solid Tetrahedron");
    if (shape == 7) Sprint(-3, -7 ,"Solid Icosahedron");
    if (shape == 8) Sprint(-3, -7 ,"Solid Teapot");
    
    // Setup view, and print view state on screen
    if (view_state == 1)
        {
        glColor3f( 1.0, 1.0, 1.0);
        Sprint(-2, 4, "Perspective view");
        glMatrixMode (GL_PROJECTION);
        glLoadIdentity();
        gluPerspective(60, 1, 1, 30);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        }else
        {
        glColor3f( 1.0, 1.0, 1.0);
        Sprint(-2, 4, "Ortho view");
        }
    
    glColor3f( 0.0, 0.0, 1.0);  // Cube color
    
    // Lighting on/off
    if (light_state == 1)
        {
        glDisable(GL_LIGHTING);  // Turn off lighting
        glDisable(GL_COLOR_MATERIAL); // Turn off material, which needs lighting to work
        }else
        {
        glEnable(GL_LIGHTING); // Turn on lighting
        glEnable(GL_COLOR_MATERIAL); // Turn on material settings
        glColorMaterial(GL_FRONT, GL_AMBIENT);
        glColor4f(0.65, 0.65, 0.65, 0.4);
        glColorMaterial(GL_FRONT, GL_EMISSION);
        glColor4f(0.10, 0.10, 0.10, 0.0);
        glColorMaterial(GL_FRONT, GL_SPECULAR);
        glColor4f(0.5, 0.5, 0.5, 0.4);
        glColorMaterial(GL_FRONT, GL_DIFFUSE);
        glColor4f(0.85, 0.85, 0.85, 0.4);
        }
    
    gluLookAt( 0, 0, 20, 0, 0, 0, 0, 1, 0);
    
    //glRotatef( 45, 1.0, 1.0, 0.0); // rotate cube
    glRotatef( spin++, 1.0, 1.0, 1.0); // spin cube
    
    if (shape == 0) glutSolidCube(10); // Draw a cube
    if (shape == 1) glutSolidCone(5,10, 16,16);  // Draw a Cone
    if (shape == 2) glutSolidSphere(5, 16,16 );  // Draw a Sphere
    if (shape == 3) glutSolidTorus( 2.5, 5, 16, 16);
    if (shape == 4)
       {
        glScalef( 3.5, 3.5, 3.5);
        glutSolidDodecahedron();
       }
    
    if (shape == 5)
       {
        glScalef( 5.0, 5.0, 5.0);
        glutSolidOctahedron();
       }
    if (shape == 6)
       {
        glScalef( 5.0, 5.0, 5.0);
        glutSolidTetrahedron();
       }
    
    if (shape == 7)
       {
        glScalef( 5.0, 5.0, 5.0);
        glutSolidIcosahedron();
       }
    if (shape == 8) glutSolidTeapot( 5 );
    
    glutSwapBuffers();
    }
    
    void display_2(void)
    {
    char *p;
    
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  //Clear the screen
    
    glMatrixMode (GL_PROJECTION);  // Tell opengl that we are doing project matrix work
    glLoadIdentity();  // Clear the matrix
    glOrtho(-8.0, 8.0, -8.0, 8.0, 0.0, 30.0);  // Setup an Ortho view
    glMatrixMode(GL_MODELVIEW);  // Tell opengl that we are doing model matrix work. (drawing)
    glLoadIdentity(); // Clear the model matrix
    
    
    glColor3f(1.0, 1.0, 1.0);
    if (shape == 0) Sprint(-3, -7 ,"Wire Cube");
    if (shape == 1) Sprint(-3, -7 ,"Wire Cone");
    if (shape == 2) Sprint(-3, -7 ,"Wire Sphere");
    if (shape == 3) Sprint(-3, -7 ,"Wire Torus");
    if (shape == 4) Sprint(-3, -7 ,"Wire Dodecahedron");
    if (shape == 5) Sprint(-3, -7 ,"Wire Octahedron");
    if (shape == 6) Sprint(-3, -7 ,"Wire Tetrahedron");
    if (shape == 7) Sprint(-3, -7 ,"Wire Icosahedron");
    if (shape == 8) Sprint(-3, -7 ,"Wire Teapot");
    
    // Setup view, and print view state on screen
    if (view_state == 1)
        {
        glColor3f( 1.0, 1.0, 1.0);
        Sprint(-2, 4, "Perspective view");
        glMatrixMode (GL_PROJECTION);
        glLoadIdentity();
        gluPerspective(60, 1, 1, 30);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        }else
        {
        glColor3f( 1.0, 1.0, 1.0);
        Sprint(-2, 4, "Ortho view");
        }
    
    glColor3f( 0.0, 0.0, 1.0);  // Cube color
    
    // Lighting on/off
    if (light_state == 1)
        {
        glDisable(GL_LIGHTING);  // Turn off lighting
        glDisable(GL_COLOR_MATERIAL); // Turn off material, which needs lighting to work
        }else
        {
        glEnable(GL_LIGHTING); // Turn on lighting
        glEnable(GL_COLOR_MATERIAL); // Turn on material settings
        glColorMaterial(GL_FRONT, GL_AMBIENT);
        glColor4f(0.65, 0.65, 0.65, 0.4);
        glColorMaterial(GL_FRONT, GL_EMISSION);
        glColor4f(0.10, 0.10, 0.10, 0.0);
        glColorMaterial(GL_FRONT, GL_SPECULAR);
        glColor4f(0.5, 0.5, 0.5, 0.4);
        glColorMaterial(GL_FRONT, GL_DIFFUSE);
        glColor4f(0.85, 0.85, 0.85, 0.4);
        }
    
    gluLookAt( 0, 0, 20, 0, 0, 0, 0, 1, 0);
    
    //glRotatef( 45, 1.0, 1.0, 0.0); // rotate cube
    glRotatef( spin++, 1.0, 1.0, 1.0); // spin cube
    
    if (shape == 0) glutWireCube(10); // Draw a cube
    if (shape == 1) glutWireCone(5,10, 16,16);  // Draw a Cone
    if (shape == 2) glutWireSphere(5, 16,16 );  // Draw a Sphere
    if (shape == 3) glutWireTorus( 2.5, 5, 16, 16);
    if (shape == 4)
       {
        glScalef( 3.5, 3.5, 3.5);
        glutSolidDodecahedron();
       }
    
    if (shape == 5)
       {
        glScalef( 5.0, 5.0, 5.0);
        glutWireOctahedron();
       }
    if (shape == 6)
       {
        glScalef( 5.0, 5.0, 5.0);
        glutWireTetrahedron();
       }
    
    if (shape == 7)
       {
        glScalef( 5.0, 5.0, 5.0);
        glutWireIcosahedron();
       }
    if (shape == 8) glutWireTeapot( 5 );
    
    glutSwapBuffers();
    }
    
    
    // This is called when the window has been resized.
    void reshape_1 (int w, int h)
    {
       glViewport (0, 0, (GLsizei) w, (GLsizei) h);
       glMatrixMode (GL_PROJECTION);
       glLoadIdentity ();
    }
    
    // This is called when the window has been resized.
    void reshape_2 (int w, int h)
    {
       glViewport (0, 0, (GLsizei) w, (GLsizei) h);
       glMatrixMode (GL_PROJECTION);
       glLoadIdentity ();
    }
    
    // Read the keyboard
    void keyboard (unsigned char key, int x, int y)
    {
       switch (key)
       {
    
          case 'v':
          case 'V':
              view_state = abs(view_state -1);
              break;
          case 'l':
          case 'L':
              light_state = abs(light_state -1);
              break;
          case 's':
          case 'S':
              shape++;
              break;
          case 27:
             exit(0); // exit program when [ESC] key presseed
             break;
          default:
             break;
       }
    
    if (shape > 8) shape = 0;
    
    }
    
    
    // Main program
    int main(int argc, char** argv)
    {
       glutInit(&amp;argc, argv);
       glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
       glutInitWindowSize (500, 500);
       glutInitWindowPosition (10, 10);
       glutTimerFunc( 10, TimeEvent, 1);
       window_1 = glutCreateWindow (argv[0]);
       glutSetWindowTitle("GlutWindow 1");
       init ();
       glutDisplayFunc(display_1);
       glutReshapeFunc(reshape_1);
       glutKeyboardFunc(keyboard);
    
       window_2 = glutCreateWindow (argv[0]);
       glutSetWindowTitle("GlutWindow 2");
       init ();
       glutDisplayFunc(display_2);
       glutReshapeFunc(reshape_2);
       glutMainLoop();
       return 0;
    }
    
    
    
    // Glutdualwindow.c
    // By Eric Stringer 2002
    // Simple examples of OpenGL and Glut usage.
    // Keyboard input
    // 'v' = view ortho/perspective
    // 'l' = lighting on/off
    
    
    #include <windows.h>  // This header file will be needed for some windows compilers
    //#include <GL/gl.h>   // gl.h and glu.h also maybe needed for some compilers
    //#include <GL/glu.h>
    #include <GL/glut.h>  // glut (gl utility toolkit) basic windows functions, keyboard, mouse.
    #include <stdio.h>    // standard (I/O library)
    #include <stdlib.h>   // standard library (set of standard C functions
    #include <math.h>     // Math library (Higher math functions )
    
    
    // lighting
    GLfloat LightAmbient[]= { 0.2f, 0.2f, 0.2f, 1.0f };
    GLfloat LightDiffuse[]= { 0.5f, 0.5f, 0.5f, 1.0f };
    GLfloat LightPosition[]= { 5.0f, 5.0f, -10.0f, 1.0f };
    GLfloat mat_specular[] = { 0.2, 0.2, 0.2, 1.0 };
    
    int window_1, window_2;
    
    static int view_state = 0, light_state = 0;
    
    int spin;
    
    int shape;
    
    // I use this to put text on the screen
    void Sprint( int x, int y, char *st)
    {
        int l,i;
    
        l=strlen( st ); // see how many characters are in text string.
        glRasterPos2i( x, y); // location to start printing text
        for( i=0; i < l; i++)  // loop until i is greater then l
            {
            glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, st[i]); // Print a character on the screen
        }
    
    }
    
    
    // This creates the spinning of the cube.
    static void TimeEvent(int te)
    {
    
        spin++;  // increase cube rotation by 1
        if (spin > 360) spin = 0; // if over 360 degress, start back at zero.
    
        glutSetWindow( window_1 );
        glutPostRedisplay();  // Update screen with new rotation data
    
        glutSetWindow( window_2 );
        glutPostRedisplay();  // Update screen with new rotation data
    
        glutTimerFunc( 100, TimeEvent, 1);  // Reset our timmer.
    }
    
    
    // Setup our Opengl world, called once at startup.
    void init(void)
    {
    
    
       glClearColor (0.0, 0.0, 0.0, 0.0);  // When screen cleared, use black.
       glShadeModel (GL_SMOOTH);  // How the object color will be rendered smooth or flat
       glEnable(GL_DEPTH_TEST);   // Check depth when rendering
       // Lighting is added to scene
       glLightfv(GL_LIGHT1 ,GL_AMBIENT, LightAmbient);
       glLightfv(GL_LIGHT1 ,GL_DIFFUSE, LightDiffuse);
       glLightfv(GL_LIGHT1 ,GL_POSITION, LightPosition);
       glEnable(GL_LIGHTING);  // Turn on lighting
       glEnable(GL_LIGHT1);    // Turn on light 1
    
    
    }
    
    
    // Draw our world
    void display_1(void)
    {
    char *p;
    
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  //Clear the screen
    
    glMatrixMode (GL_PROJECTION);  // Tell opengl that we are doing project matrix work
    glLoadIdentity();  // Clear the matrix
    glOrtho(-8.0, 8.0, -8.0, 8.0, 0.0, 30.0);  // Setup an Ortho view
    glMatrixMode(GL_MODELVIEW);  // Tell opengl that we are doing model matrix work. (drawing)
    glLoadIdentity(); // Clear the model matrix
    
    
    glColor3f(1.0, 1.0, 1.0);
    if (shape == 0) Sprint(-3, -7 ,"Solid Cube");
    if (shape == 1) Sprint(-3, -7 ,"Solid Cone");
    if (shape == 2) Sprint(-3, -7 ,"Solid Sphere");
    if (shape == 3) Sprint(-3, -7 ,"Solid Torus");
    if (shape == 4) Sprint(-3, -7 ,"Solid Dodecahedron");
    if (shape == 5) Sprint(-3, -7 ,"Solid Octahedron");
    if (shape == 6) Sprint(-3, -7 ,"Solid Tetrahedron");
    if (shape == 7) Sprint(-3, -7 ,"Solid Icosahedron");
    if (shape == 8) Sprint(-3, -7 ,"Solid Teapot");
    
    // Setup view, and print view state on screen
    if (view_state == 1)
        {
        glColor3f( 1.0, 1.0, 1.0);
        Sprint(-2, 4, "Perspective view");
        glMatrixMode (GL_PROJECTION);
        glLoadIdentity();
        gluPerspective(60, 1, 1, 30);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        }else
        {
        glColor3f( 1.0, 1.0, 1.0);
        Sprint(-2, 4, "Ortho view");
        }
    
    glColor3f( 0.0, 0.0, 1.0);  // Cube color
    
    // Lighting on/off
    if (light_state == 1)
        {
        glDisable(GL_LIGHTING);  // Turn off lighting
        glDisable(GL_COLOR_MATERIAL); // Turn off material, which needs lighting to work
        }else
        {
        glEnable(GL_LIGHTING); // Turn on lighting
        glEnable(GL_COLOR_MATERIAL); // Turn on material settings
        glColorMaterial(GL_FRONT, GL_AMBIENT);
        glColor4f(0.65, 0.65, 0.65, 0.4);
        glColorMaterial(GL_FRONT, GL_EMISSION);
        glColor4f(0.10, 0.10, 0.10, 0.0);
        glColorMaterial(GL_FRONT, GL_SPECULAR);
        glColor4f(0.5, 0.5, 0.5, 0.4);
        glColorMaterial(GL_FRONT, GL_DIFFUSE);
        glColor4f(0.85, 0.85, 0.85, 0.4);
        }
    
    gluLookAt( 0, 0, 20, 0, 0, 0, 0, 1, 0);
    
    //glRotatef( 45, 1.0, 1.0, 0.0); // rotate cube
    glRotatef( spin++, 1.0, 1.0, 1.0); // spin cube
    
    if (shape == 0) glutSolidCube(10); // Draw a cube
    if (shape == 1) glutSolidCone(5,10, 16,16);  // Draw a Cone
    if (shape == 2) glutSolidSphere(5, 16,16 );  // Draw a Sphere
    if (shape == 3) glutSolidTorus( 2.5, 5, 16, 16);
    if (shape == 4)
       {
        glScalef( 3.5, 3.5, 3.5);
        glutSolidDodecahedron();
       }
    
    if (shape == 5)
       {
        glScalef( 5.0, 5.0, 5.0);
        glutSolidOctahedron();
       }
    if (shape == 6)
       {
        glScalef( 5.0, 5.0, 5.0);
        glutSolidTetrahedron();
       }
    
    if (shape == 7)
       {
        glScalef( 5.0, 5.0, 5.0);
        glutSolidIcosahedron();
       }
    if (shape == 8) glutSolidTeapot( 5 );
    
    glutSwapBuffers();
    }
    
    void display_2(void)
    {
    char *p;
    
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  //Clear the screen
    
    glMatrixMode (GL_PROJECTION);  // Tell opengl that we are doing project matrix work
    glLoadIdentity();  // Clear the matrix
    glOrtho(-8.0, 8.0, -8.0, 8.0, 0.0, 30.0);  // Setup an Ortho view
    glMatrixMode(GL_MODELVIEW);  // Tell opengl that we are doing model matrix work. (drawing)
    glLoadIdentity(); // Clear the model matrix
    
    
    glColor3f(1.0, 1.0, 1.0);
    if (shape == 0) Sprint(-3, -7 ,"Wire Cube");
    if (shape == 1) Sprint(-3, -7 ,"Wire Cone");
    if (shape == 2) Sprint(-3, -7 ,"Wire Sphere");
    if (shape == 3) Sprint(-3, -7 ,"Wire Torus");
    if (shape == 4) Sprint(-3, -7 ,"Wire Dodecahedron");
    if (shape == 5) Sprint(-3, -7 ,"Wire Octahedron");
    if (shape == 6) Sprint(-3, -7 ,"Wire Tetrahedron");
    if (shape == 7) Sprint(-3, -7 ,"Wire Icosahedron");
    if (shape == 8) Sprint(-3, -7 ,"Wire Teapot");
    
    // Setup view, and print view state on screen
    if (view_state == 1)
        {
        glColor3f( 1.0, 1.0, 1.0);
        Sprint(-2, 4, "Perspective view");
        glMatrixMode (GL_PROJECTION);
        glLoadIdentity();
        gluPerspective(60, 1, 1, 30);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        }else
        {
        glColor3f( 1.0, 1.0, 1.0);
        Sprint(-2, 4, "Ortho view");
        }
    
    glColor3f( 0.0, 0.0, 1.0);  // Cube color
    
    // Lighting on/off
    if (light_state == 1)
        {
        glDisable(GL_LIGHTING);  // Turn off lighting
        glDisable(GL_COLOR_MATERIAL); // Turn off material, which needs lighting to work
        }else
        {
        glEnable(GL_LIGHTING); // Turn on lighting
        glEnable(GL_COLOR_MATERIAL); // Turn on material settings
        glColorMaterial(GL_FRONT, GL_AMBIENT);
        glColor4f(0.65, 0.65, 0.65, 0.4);
        glColorMaterial(GL_FRONT, GL_EMISSION);
        glColor4f(0.10, 0.10, 0.10, 0.0);
        glColorMaterial(GL_FRONT, GL_SPECULAR);
        glColor4f(0.5, 0.5, 0.5, 0.4);
        glColorMaterial(GL_FRONT, GL_DIFFUSE);
        glColor4f(0.85, 0.85, 0.85, 0.4);
        }
    
    gluLookAt( 0, 0, 20, 0, 0, 0, 0, 1, 0);
    
    //glRotatef( 45, 1.0, 1.0, 0.0); // rotate cube
    glRotatef( spin++, 1.0, 1.0, 1.0); // spin cube
    
    if (shape == 0) glutWireCube(10); // Draw a cube
    if (shape == 1) glutWireCone(5,10, 16,16);  // Draw a Cone
    if (shape == 2) glutWireSphere(5, 16,16 );  // Draw a Sphere
    if (shape == 3) glutWireTorus( 2.5, 5, 16, 16);
    if (shape == 4)
       {
        glScalef( 3.5, 3.5, 3.5);
        glutSolidDodecahedron();
       }
    
    if (shape == 5)
       {
        glScalef( 5.0, 5.0, 5.0);
        glutWireOctahedron();
       }
    if (shape == 6)
       {
        glScalef( 5.0, 5.0, 5.0);
        glutWireTetrahedron();
       }
    
    if (shape == 7)
       {
        glScalef( 5.0, 5.0, 5.0);
        glutWireIcosahedron();
       }
    if (shape == 8) glutWireTeapot( 5 );
    
    glutSwapBuffers();
    }
    
    
    // This is called when the window has been resized.
    void reshape_1 (int w, int h)
    {
       glViewport (0, 0, (GLsizei) w, (GLsizei) h);
       glMatrixMode (GL_PROJECTION);
       glLoadIdentity ();
    }
    
    // This is called when the window has been resized.
    void reshape_2 (int w, int h)
    {
       glViewport (0, 0, (GLsizei) w, (GLsizei) h);
       glMatrixMode (GL_PROJECTION);
       glLoadIdentity ();
    }
    
    // Read the keyboard
    void keyboard (unsigned char key, int x, int y)
    {
       switch (key)
       {
    
          case 'v':
          case 'V':
              view_state = abs(view_state -1);
              break;
          case 'l':
          case 'L':
              light_state = abs(light_state -1);
              break;
          case 's':
          case 'S':
              shape++;
              break;
          case 27:
             exit(0); // exit program when [ESC] key presseed
             break;
          default:
             break;
       }
    
    if (shape > 8) shape = 0;
    
    }
    
    
    // Main program
    int main(int argc, char** argv)
    {
       glutInit(&amp;argc, argv);
       glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
       glutInitWindowSize (500, 500);
       glutInitWindowPosition (10, 10);
       glutTimerFunc( 10, TimeEvent, 1);
       window_1 = glutCreateWindow (argv[0]);
       glutSetWindowTitle("GlutWindow 1");
       init ();
       glutDisplayFunc(display_1);
       glutReshapeFunc(reshape_1);
       glutKeyboardFunc(keyboard);
    
       window_2 = glutCreateWindow (argv[0]);
       glutSetWindowTitle("GlutWindow 2");
       init ();
       glutDisplayFunc(display_2);
       glutReshapeFunc(reshape_2);
       glutMainLoop();
       return 0;
    }
    

    I ran the sample code at Windows 7 but I had to replace one line of glutIntit to

    glutInit(&argc, argv);
    
    0 讨论(0)
提交回复
热议问题