在OpenGl中加载多个对象

时间:2016-04-20 15:10:30

标签: c++ opengl glut

我是OpenGL的新手,现在我正在学习创建一个对象。我正在尝试加载多个对象,但只显示最后一个对象。

#include <gl/glut.h>
#include <math.h>

void Box (void){
  glClear(GL_COLOR_BUFFER_BIT);
  glBegin(GL_POLYGON);
  glColor3f(1.0f,0.0f,0.0f);
  glVertex3f(-0.14,-0.10,0.00);
  glVertex3f(0.10,-0.10,0.00);
  glVertex3f(0.10,0.30,0.00);
  glVertex3f(-0.03,0.30,0.00);
  glVertex3f(-0.14,0.00,0.00);
  glEnd();
  glFlush();
}

void Circle(float cx, float cy, float r, int segmen)
{
  glBegin(GL_POLYGON);
  for(int i = 0; i &lt; segmen; i++)
  {
    float theta = 2.0f * 3.14f * float(i) / float(segmen);
    float x = r * cosf(theta);
    float y = r * sinf(theta);
    glVertex3f(x + cx, y + cy,0.0);
  }
  glEnd();
}

void CreateCircle(void) {
  glClear(GL_COLOR_BUFFER_BIT);
  glColor3f(1.0, 1.0, 0.0);
  Circle(0.5, 0.5, 0.2, 45);
  glFlush();
}

void Draw (void) {
  glPushMatrix();
  Box();
  glPopMatrix();
  glPushMatrix();
    glTranslatef(0.14,0.0,0.0);
    glRotatef(90.0,0.0,0.0,1.0);
    Box();
  glPopMatrix();
  glPushMatrix();
    CreateCircle();
  glPopMatrix();

  glFlush();
}

int main (int argc,char* argv[]){
  glutInit(&argc,argv);
  glutInitWindowSize(800,800);
  glutInitDisplayMode(GLUT_SINGLE|GLUT_RGBA);

  glutCreateWindow("object5B");
  glutDisplayFunc(Draw);
  glClear(GL_COLOR_BUFFER_BIT);
  glClearColor(1.0f,1.0f,1.0f,1.0);
  glutMainLoop();
  return 0;
}

在尝试在互联网上搜索时,我发现了一些关于object_list的内容,但我并没有真正理解它。希望你能帮忙。

2 个答案:

答案 0 :(得分:1)

就像genpfault所说的那样,每次绘制一个对象时都会清除COLOR_BUFFER_BIT,这会导致先前绘制的对象从屏幕上被删除(颜色)。在绘制屏幕之前,您只需要在开始时调用glClear()一次。

无论如何,我建议你搜索一下现代的OpenGL。现在使用OpenGL的方式是名称&#34;立即模式&#34;这是坏事,慢事和弃用。这是good site

答案 1 :(得分:0)

我认为您的问题是您的使用:

glClear(GL_COLOR_BUFFER_BIT);

您在Box()和CreateCircle()函数中调用它。这样做会导致您似乎在描述的问题。该呼叫不属于这些功能。它属于Draw()函数的顶部,而不是其他任何地方。