潜在的bug openGL

时间:2010-09-28 21:43:49

标签: c++ opengl glut menu

我正尝试使用菜单在屏幕上平铺图像。我的菜单以适当的方式正常工作 - 直到我移动鼠标然后平铺设计消失了?

#include <GL/glut.h>    
#include <fstream>      
#include <cstdlib>
#include "TUGL.h"
#include <glui.h>

//Global variables

class GLintPoint
{
  public:
    GLint x;
    GLint y;
};

GLint  numpoints;    
GLintPoint P[10];      


window Win(800,600);
frame Frame;
GLUI *glui;
int mainwindow;

//Function prototypes

void readinpoints();                  
void drawline(GLint from, GLint to);   
void display(void);                   
void init (void);                     
void keyboard(unsigned char key, int x, int y);
void tile1(void);
void tile4(void);
void tile9(void);
void tile16(void);
void myReshape(GLsizei W, GLsizei H);
void define_glui_window();
void choice_selected(int value);
void drawImage(void);
//Main

int main(int argc, char** argv)
{
  glutInit(&argc, argv);
  glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
  glutInitWindowSize (Win.width, Win.height);
  glutInitWindowPosition (100, 100);
  mainwindow = glutCreateWindow ("*star*");

  init();
  define_glui_window();
  glutDisplayFunc(display);
  glutKeyboardFunc(keyboard);  
  glutReshapeFunc(myReshape);
  readinpoints();

  glutMainLoop();
  return 0;
}

//Functions

void init (void)
{
  glClearColor (0.0, 0.0, 0.0, 0.0);    //set background color
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  glOrtho(0.0, 200, 0.0, 249, -1.0, 1.0);

}

void readinpoints()

{
  ifstream infile("polyline.pts");

  numpoints=0;
  infile>>P[numpoints].x>>P[numpoints].y;
  while (!infile.eof())
  {
    numpoints++;
    infile>>P[numpoints].x>>P[numpoints].y;
  }
  numpoints=numpoints-1;
}

void drawline(GLint from, GLint to)

{
  glBegin(GL_LINES);
  {
    glVertex2i(P[from].x, P[from].y);
    glVertex2i(P[to].x, P[to].y);
  }
  glEnd();
}

void drawImage(void);
{
  glClear (GL_COLOR_BUFFER_BIT)
  glColor3f (1.0, 0.0, 1.0);       
  glLineWidth(3);

  drawline(0,1);        
  drawline(1,2);       
  drawline(2,3);        
  drawline(3,4);
  drawline(4,5);
  drawline(5,6);
  drawline(6,7);
  drawline(7,8);
  drawline(8,9);
  drawline(9,0);

  glFlush();

}

void display(void)

{
  glClear (GL_COLOR_BUFFER_BIT);  
  //autoViewPort(Frame, Win); 
  drawImage();            
}

void tile1(void)

{   glClear (GL_COLOR_BUFFER_BIT);
    for(int i=0; i < 1; i++)
      for(int j=0; j < 1; j++)
        {
          //autoViewPort(Frame, Win);
          glViewport(i * 800, j * 600, 800, 600);
          drawImage();
          glFlush();
        }
}
void tile4(void)

{   glClear (GL_COLOR_BUFFER_BIT);
    for(int i=0; i < 2; i++)
      for(int j=0; j < 2; j++)
        {
         // autoViewPort(400, 300);
          glViewport(i * 400, j * 300, 400, 300);
          drawImage();
                  glFlush();
        }
}
void tile9(void)

{
    glClear (GL_COLOR_BUFFER_BIT);
    for(int i=0; i < 3; i++)
      for(int j=0; j < 3; j++)
        {
         // autoViewPort(267, 200);
          glViewport(i * 267, j * 200, 267, 200);
          drawImage();
                  glFlush();
        }
}
void tile16(void)
{
    glClear (GL_COLOR_BUFFER_BIT);
    for(int i=0; i < 4; i++)
      for(int j=0; j < 4; j++)
        {
         // autoViewPort(200, 150);
          glViewport(i * 200, j * 150, 200, 150);
          drawImage();
                  glFlush();
        }
}
void keyboard(unsigned char key, int x, int y)
{
   switch (key) {           
      case 27:     
         exit(0);
         break;
      case 'f': 

    tile4();
    break;
    case 'n': 
    tile9();
    break;
   case 's':
    tile16();
    break;
   case 'o':
    tile1();
    break;
   }
}
void myReshape(GLsizei W, GLsizei H)

{
  Win.set(W,H);
  autoViewPort(Frame, Win);
}

void choice_selected(int value)

{
   switch (value)
   {
     case 1:
       tile1();
       break;
     case 2:
       tile4();
       break;
     case 3:
       tile9();
       break;
     case 4:
       tile16();
       break;
   }
}

void define_glui_window()
{
  glui =  GLUI_Master.create_glui("OPTIONS", 0, 560, 50); 

  GLUI_StaticText *message1 = glui->add_statictext("  BACKGROUND COLOR  ");
  glui->add_button("Tile-1", 1, choice_selected);
  glui->add_button("Tile-4", 2, choice_selected);
  glui->add_button("Tile-9", 3, choice_selected);
  glui->add_button("Tile-16", 4, choice_selected);
  glui->set_main_gfx_window(mainwindow);
  GLUI_Master.sync_live_all();
}

2 个答案:

答案 0 :(得分:2)

在每次OpenGL调用后检查glError()的错误。失败的点将返回错误。然后,您还可以查找错误代码,以获取有关出错的更多信息。

答案 1 :(得分:1)

尝试

  

glutPostRedisplay();

在glFlush();

之后