c++ - 在 OpenGl 中加载多个对象

标签 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 的信息,但我并没有真正理解它。希望你能帮上忙。

最佳答案

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


无论如何,我建议您搜索现代 OpenGL。您现在使用 OpenGL 的方式被称为“即时模式”,它不好、慢且已弃用。这是一个 good site

关于c++ - 在 OpenGl 中加载多个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36748049/

相关文章:

c++ - OpenGL - 这是在舞台上绘制旋转环的正确方法吗?

c++ - 在线程之间 move vector

c++ - 矩阵对角零点

c++ - 纹理渲染和 VBO 的 [OpenGL/SDL/C++]

java - GLSL 着色器 : Interpolate between more than two textures

c++ - OpenGL 分配纹理 ID 的方法是什么?

c - 如何将简单的 opengl 线图代码转换为使用顶点数组

c++ - 如何在没有友元函数的情况下重载 << 运算符

c++ - 检查 16 个容器中是否存在值

macos - 如何在 Mac 上运行的 glut 程序中检测命令键作为修饰符?