0

サンプルの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;
}
4

2 に答える 2

1

int main は、glutMainLoop() が必要な場所ではありません。

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);

}

上記のコードは完全に機能するはずです。

編集

オープングルによると

AGL は、C バインディングを持つ古い Carbon ベースの API です。ウィンドウ処理とイベント処理に必要な Carbon 部分は、スレッドセーフではありません。この API の 64 ビット バージョンはありません。

これはあなたの問題なのだろうか。問題を解決する可能性のある手順を見逃していないかどうかを確認するために、Apple のopengl プログラミング ガイドを確認します。

于 2012-04-20T17:14:58.700 に答える
0

これはコンパイラのバグでした (gcc で動作するようになりました)。

于 2012-04-23T10:26:21.283 に答える