mac osx Lion中的glutMainLoop冻结了应用程序

时间:2012-04-20 17:05:49

标签: macos glut

我正在尝试运行示例GLUT程序,但它只创建一个白色窗口然后冻结应用程序。我发现它在调用glutMainLoop时会冻结(如果我在循环中调用glutCheckLoop则相同)。我可能遗失的东西?

以下是我找到的示例代码:

#include <stdlib.h>

#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif

// Question 1: In a GLUT program, how is control passed
// back to the programmer?  How is this set up during
// initialization?

int win_width = 512;
int win_height = 512;

void display( void )
{
  glClear( GL_COLOR_BUFFER_BIT );

  glutSwapBuffers();
}

void reshape( int w, int h )
{
  glMatrixMode( GL_PROJECTION );
  glLoadIdentity();

  // Question 3: What do the calls to glOrtho()
  // and glViewport() accomplish?
  glOrtho( 0., 1., 0., 1., -1., 1. );
  glViewport( 0, 0, w, h );

  win_width = w;
  win_height = h;

  glutPostRedisplay();
}

void keyboard( unsigned char key, int x, int y ) {
  switch(key) {
  case 27: // Escape key
    exit(0);
    break;
  }
}

int main (int argc, char *argv[]) {

  glutInit( &argc, argv );
  // Question 2: What does the parameter to glutInitDisplayMode()
  // specify?
  glutInitDisplayMode( GLUT_RGBA | GLUT_DOUBLE );
  glutInitWindowSize( win_width, win_height );

  glutCreateWindow( "Intro Graphics Assignment 1" );

  glutDisplayFunc( display );
  glutReshapeFunc( reshape );
  glutKeyboardFunc( keyboard );

  glutMainLoop();
  return 0;
}

2 个答案:

答案 0 :(得分:1)

int main不是你想要的glutMainLoop(),mate。

你应该在init方法中使用它,即initGlutDisplay()。

#include <stdlib.h>

#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif

// Question 1: In a GLUT program, how is control passed
// back to the programmer?  How is this set up during
// initialization?

int win_width = 512;
int win_height = 512;


void display( void )
{
  glClear( GL_COLOR_BUFFER_BIT );

  glutSwapBuffers();
}

void reshape( int w, int h )
{
  glMatrixMode( GL_PROJECTION );
  glLoadIdentity();

  // Question 3: What do the calls to glOrtho()
  // and glViewport() accomplish?
  glOrtho( 0., 1., 0., 1., -1., 1. );
  glViewport( 0, 0, w, h );

  win_width = w;
  win_height = h;

  glutPostRedisplay();
}

void keyboard( unsigned char key, int x, int y ) {
  switch(key) {
  case 27: // Escape key
    exit(0);
    break;
  }
}
int initGlutDisplay(int argc, char* argv[]){
  glutInit( &argc, argv );
  // Question 2: What does the parameter to glutInitDisplayMode()
  // specify?
  glutInitDisplayMode( GLUT_RGBA | GLUT_DOUBLE );
  glutInitWindowSize( win_width, win_height );

  glutCreateWindow( "Intro Graphics Assignment 1" );

  glutDisplayFunc( display );
  glutReshapeFunc( reshape );
  glutKeyboardFunc( keyboard );

  glutMainLoop();
  return 0;
}
int main (int argc, char *argv[]) {
  int win_width = 512;
  int win_height = 512;
  initGlutDisplay(argc, argv);

}

上述代码应该可以正常运行。

修改

根据opengl

  

AGL是旧的基于碳的API,带有C绑定。碳部分   窗口和事件处理所需的不是线程安全的。有   没有这个API的64位版本。

我想知道这是不是你的问题。我会审核苹果的opengl Programming guide,看看你是否错过了任何可能解决问题的步骤。

答案 1 :(得分:0)

这是编译器中的一个错误(现在使用gcc工作)