无法在openGL中绘制对象

问题描述 投票:1回答:1

[我在第一个窗口的opengl中绘制了一个正方形,当我尝试在第二个屏幕上绘制一些对象时,出现空白屏幕。

这是我的代码。

#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'时,它应该显示第二个屏幕。第一个屏幕和对象成功到达,但是,我在这里得到了第二个屏幕,但是在第二个屏幕中却没有得到对象。在这种情况下,第二个屏幕是空白的。告诉我这段代码有什么问题,还是有其他方法可以实现?

我正在使用C编程在ubuntu 18.04中进行opengl。

c linux opengl glut opengl-compat
1个回答
0
投票

一些说明使您的问题解决:

  • 使用glutDisplayFunc之前,必须选择窗口。如果只有一个窗口,则不会出现问题,但是如果有两个窗口,则必须先调用glutSetWindow(...)

  • 也请注意,glutInitWindow...函数可用于要创建的next窗口。

  • [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;
}
© www.soinside.com 2019 - 2024. All rights reserved.