OpenGL粒子系统

3

我正在尝试使用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();

}

几秒钟后我得到了一个黑色窗口(在此之前,窗口只有标题栏)。我哪里做错了?

更新:每个粒子的x和y坐标都在区间(0,size)内。


你能贴出你的整个代码吗?我们不知道particle[]数组是什么。我猜测粒子不在默认投影内。 - levis501
不要紧,其余的代码已经经过测试并且正常工作。这段代码有几千行,我看不出这会有什么帮助。重点是X(particle[i])表示粒子的x坐标,Y(particle[i])表示粒子的y坐标,这是与OpenGL部分相关的唯一重要信息。 - w00t
1
你在任何地方调用了glOrtho吗? - Jim Buck
2
我会将 glClearColor 进行更改,以查看它是否有任何作用,然后尝试在中心渲染一个点,以查看我的模型视图投影矩阵是否正确。 - alxx
@alxx,我在调用glPointSize()之前的主函数中添加了glClearColor(1,0,0,0);,并从display()中删除了循环,只留下glVertex2f(size/2,size/2),这样它将在屏幕中央每次迭代打印一个粒子。仍然是相同的行为,当只有标题栏出现时,几秒钟后窗口变成黑色。 - w00t
显示剩余2条评论
1个回答

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);  
    }
  • glFlush函数从glutSwapBuffers函数中调用,因此您不需要在那里使用它
  • 在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); 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接