Search code examples
clinuxopenglglutopengl-compat

can't draw object in openGL


I've drawn a square in opengl in 1st window , and when I try to draw some object on second screen .I am getting a blank screen.

here is my code.

#include <GL/glut.h>
void display() {
glClearColor(1.0f, 0.0f, 0.0f, 1.0f); // Set background color to black and opaque
//glClear(GL_COLOR_BUFFER_BIT);         // Clear the color buffer (background) 
// Draw a Red 1x1 Square centered at origin
 glBegin(GL_QUADS);              // Each set of 4 vertices form a quad
   glColor3f(0.0f, 1.0f, 0.0f); // Red
  glVertex2f(-0.5f, -0.5f);    // x, y
   glVertex2f( 0.5f, -0.5f);
  glVertex2f( 0.5f,  0.5f);
  glVertex2f(-0.5f,  0.5f);
 glEnd();
 glFlush();  // Render now
}
void displayc2()
{
 glClear(GL_COLOR_BUFFER_BIT);         // Clear the color buffer (background)
 glClearColor(1.0f, 0.0f, 0.0f, 1.0f); // Set background color to black and opaque
 glBegin(GL_QUADS);              // Each set of 4 vertices form a quad
  glColor3f(0.0f, 1.0f, 0.0f); // green
  glVertex2f(-0.5f, -0.5f);    // x, y
  glVertex2f( 0.5f, -0.5f);
  glVertex2f( 0.5f,  0.5f);
  glVertex2f(-0.5f,  0.5f);
  glEnd();
  }

void keycb(unsigned char key,int x , int y)
{
    int win2;
    if(key=='a') exit(0);
    else if(key == 'b')
  {
        win2 = glutCreateWindow("window 2");
      glutInitWindowSize(450, 450);   // Set the window's initial width & height
      glutInitWindowPosition(50, 50);
      glutDisplayFunc(displayc2); 
      glutMainLoop();           // Enter the event-processing loop
  }
}
 int main(int argc, char** argv) {

  int win1;

 glutInit(&argc, argv);                 // Initialize GLUT
 win1 = glutCreateWindow("OpenGL Setup Test"); // Create a window with the given title
 glutInitWindowSize(450, 450);   // Set the window's initial width & height
 glutInitWindowPosition(50, 50); // Position the window's initial top-left corner
 glutDisplayFunc(display); // Register display callback handler for window re-paint
 glutKeyboardFunc(keycb);

  glutMainLoop();           // Enter the event-processing loop
 return 0;
}

What I am trying to do is , when I press the character 'b' on my keyboard , it should display a second screen . The first screen and the object are coming successfully But,here I am getting the second screen but i am not getting the object in the second screen.the second screen is blank in this case. tell me whats wrong in this code or is there any other way to acheive this ?

I am doing opengl in ubuntu 18.04 using C programming.


Solution

  • Some remarks to make your problem work:

    • before using glutDisplayFunc, you must select the window. If you have only one window, the question does not ask, but if you have two, you must call glutSetWindow(...) before.

    • note too that glutInitWindow... function work for the next window to be created.

    • glutMainLoop should be called once.
    • And finally, do not forget to call glFlush() at the end of display functions:
    #include <GL/glut.h>
    
    
    int win1, win2;
    
    void display()
    {
        glClearColor(1.0f, 0.0f, 0.0f, 1.0f);       // Set background color to black and opaque
        glBegin(GL_QUADS);          // Each set of 4 vertices form a quad
        glColor3f(1.0f, 0.0f, 0.0f);        // Red
        glVertex2f(-0.5f, -0.5f);   // x, y
        glVertex2f(0.5f, -0.5f);
        glVertex2f(0.5f, 0.5f);
        glVertex2f(-0.5f, 0.5f);
        glEnd();
        glFlush();                  // Render now
    }
    
    void displayc2()
    {
        glClear(GL_COLOR_BUFFER_BIT);       // Clear the color buffer (background)
        glClearColor(1.0f, 0.0f, 0.0f, 1.0f);       // Set background color to black and opaque
        glBegin(GL_QUADS);          // Each set of 4 vertices form a quad
        glColor3f(0.0f, 1.0f, 0.0f);        // green
        glVertex2f(-0.5f, -0.5f);   // x, y
        glVertex2f(0.5f, -0.5f);
        glVertex2f(0.5f, 0.5f);
        glVertex2f(-0.5f, 0.5f);
        glEnd();
        glFlush();                  // Render now
    }
    
    void keycb(unsigned char key, int x, int y)
    {
        if (key == 'a')
            exit(0);
        else if (key == 'b'&&win2==0) {
            glutInitWindowSize(450, 450);   
            glutInitWindowPosition(250, 250);
    
            win2 = glutCreateWindow("window 2");
    
            // Select the window for glutDisplayFunc
            glutSetWindow(win2);
            glutDisplayFunc(displayc2);
        }
    }
    
    int main(int argc, char **argv)
    {
    
        glutInit(&argc, argv);      // Initialize GLUT
        glutInitWindowSize(450, 450);       // Set the window's initial width & height
        glutInitWindowPosition(50, 50);     // Position the window's initial top-left corner
        win1 = glutCreateWindow("OpenGL Setup Test");       // Create a window with the given title
        glutDisplayFunc(display);   // Register display callback handler for window re-paint
        glutKeyboardFunc(keycb);
    
        glutMainLoop();             // Enter the event-processing loop
        return 0;
    }