не могу нарисовать объект в openGL - PullRequest
1 голос
/ 27 апреля 2020

Я нарисовал квадрат в opengl в 1-м окне, и когда я пытаюсь нарисовать какой-то объект на втором экране. У меня пустой экран.

вот мой код.

#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;
}

Что я пытаюсь сделать, так это то, что когда я нажимаю на клавиатуре символ «b», он должен отображать второй экран. Первый экран и объект идут успешно. Но здесь я получаю второй экран, но я не получаю объект на втором экране. В этом случае второй экран пуст. скажите мне, что не так в этом коде или есть другой способ добиться этого?

Я делаю opengl в Ubuntu 18.04, используя C программирование.

1 Ответ

1 голос
/ 27 апреля 2020

Некоторые замечания, чтобы ваша проблема работала:

  • перед использованием glutDisplayFunc, вы должны выбрать окно. Если у вас есть только одно окно, вопрос не задается, но если у вас есть два, вы должны позвонить glutSetWindow(...) раньше.

  • также обратите внимание, что функция glutInitWindow... работает для следующее окно, которое будет создано.

  • glutMainLoop следует вызывать один раз.
  • И, наконец, не забудьте вызвать glFlush() в конце display функции:
#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;
}
...