OpenGL粒子系统

时间:2011-03-10 04:17:17

标签: opengl freeglut

我正在尝试使用OpenGl来模拟粒子系统,但我无法让它工作,这是我到目前为止所做的:

#include <GL/glut.h>
int main (int argc, char **argv){

  // data allocation, various non opengl stuff
  ............
  glutInit(&argc, argv);
  glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE );
  glutInitWindowPosition(100,100);
  glutInitWindowSize(size, size);
  glPointSize (4);
  glutCreateWindow("test gl");
  ............
  // initial state, not opengl
  ............
  glViewport(0,0,size,size);
  glutDisplayFunc(display);
  glutIdleFunc(compute);
  glutMainLoop();


}

void compute (void) {

 // change state not opengl

  glutPostRedisplay();

}

void display (void) {

  glClear(GL_COLOR_BUFFER_BIT);
  glBegin(GL_POINTS);

  for(i = 0; i<nparticles; i++) {

    // two types of particles
    if (TYPE(particle[i]) == 1) glColor3f(1,0,0);
      else glColor3f(0,0,1);

    glVertex2f(X(particle[i]),Y(particle[i]));

  }

  glEnd();
  glFlush();
  glutSwapBuffers();

}

几秒后我得到一个黑色的窗口(窗口之前只有标题栏)。我哪里出错?

LE:每个粒子的x和y坐标都在区间(0,大小)内

1 个答案:

答案 0 :(得分:2)

尝试在代码中进行这些更改:

  • 移动文件末尾的Main函数
  • glPoinSize调用属于Display函数
  • 然后你应该提供一个函数来处理窗口glutReshapeFunc(reshape)的大小调整,像这样
    void reshape(int w, int h)
    {
        glViewport(0, 0, (GLsizei) w, (GLsizei) h);  
        glMatrixMode(GL_PROJECTION);  
        glLoadIdentity();  
        gluOrtho2D(0.0, (GLdouble) w, 0.0, (GLdouble) h);  
    }
  • 从glutSwapBuffers函数调用glFlush,因此你不需要它
  • 插入此代码(在glutCreateWindow调用之后)以设置投影的初始位置
    glClearColor(0.2, 0.0, 0.0, 0.0);    
    glMatrixMode(GL_PROJECTION);  
    glLoadIdentity();  
    glOrtho(0.0, 10, 0.0, 10, -1.0, 1.0);