在opengl中创建对象的正确方法?

时间:2011-02-27 21:43:21

标签: opengl glut vertex

我真的很喜欢opengl,现在我正在学习基础知识。我有一个高级别的问题。 如果我想创建一个对象,请说一个列是所有选项吗?

  1. 从任何外部程序(如3DStudio)导入3D网格,并将其加载到opengl
  2. 使用glVertex3f
  3. 创建6个多边形
  4. 过度通话? (我见过glutSolidCube,但没有像glutSolidColumn)
  5. 我的问题是:

    A)还有其他办法吗?

    B)如果不使用3DStudio网格,在opengl中创建普通对象/动画对象的正确方法是什么?

    C)这个代码在2)中创建列是否正确?(如果是,我将尝试使用x,y,z变量对其进行参数化,以获得给定的列具有给定高度的地砖)

    //Column
    //Wall
    glBegin(GL_POLYGON); 
        glVertex3f(150.0f, 250.0f,50);   // x1, y1 - top-left corner    
        glVertex3f(50.0f, 250.0f,50);   // x2, y1 - top-right corner
        glVertex3f(50.0f, 50.0f,50);        // x2, y2 - bottom-right corner
        glVertex3f(150.0f, 50.0f,50);    // x1, y2 - bottom-left corner
    
    glEnd( );
    
    //Wall
    glBegin(GL_POLYGON); 
        glVertex3f(50.0f,  250.0f,0);   // x1, y1 - top-left corner 
        glVertex3f(150.0f, 250.0f,0);  // x2, y1 - top-right corner
        glVertex3f(150.0f, 50.0f,0);   // x2, y2 - bottom-right corner
        glVertex3f(50.0f,  50.0f,0);    // x1, y2 - bottom-left corner
    glEnd( );
    
    //Wall
    glBegin(GL_POLYGON);
        glVertex3f(150.0f, 250.0f,0);       // x1, y1 - top-left corner 
        glVertex3f(150.0f, 250.0f,50.0f);   // x2, y1 - top-right corner
        glVertex3f(150.0f, 50.0f,50.0f);        // x2, y2 - bottom-right corner
        glVertex3f(150.0f, 50.0f,0);    // x1, y2 - bottom-left corner
    glEnd( );
    
    //Wall
    glBegin(GL_POLYGON);
        glVertex3f(50.0f, 250.0f,50);       // x1, y1 - top-left corner 
        glVertex3f(50.0f, 250.0f,0);    // x2, y1 - top-right corner
        glVertex3f(50.0f, 50.0f,0);     // x2, y2 - bottom-right corner
        glVertex3f(50.0f, 50.0f,50);    // x1, y2 - bottom-left corner
    glEnd( );
    
    //Floor
    glBegin(GL_POLYGON);
        glVertex3f(50.0f, 50.0f, 0);        // x1, y1 - top-left corner 
        glVertex3f(50.0f, 50.0f, 50);   // x2, y1 - top-right corner
        glVertex3f(0, 50.0f, 50);       // x2, y2 - bottom-right corner
        glVertex3f(0, 50.0f, 0);    // x1, y2 - bottom-left corner
    glEnd( );
    
    //Ceiling
    glBegin(GL_POLYGON);
        glVertex3f(50.0f, 250.0f, 0);       // x1, y1 - top-left corner 
        glVertex3f(50.0f, 250.0f, 50);  // x2, y1 - top-right corner
        glVertex3f(0, 250.0f, 50);      // x2, y2 - bottom-right corner
        glVertex3f(0, 250.0f, 0);    // x1, y2 - bottom-left corner
    glEnd( );
    

2 个答案:

答案 0 :(得分:5)

这取决于你对正确的定义。逐一回答:

  1. 这将是最正常的方式;但是OpenGL只是一个渲染库,由你来提供加载你感兴趣的文件格式的代码;
  2. glVertex3f是一个糟糕的选择;见下面的博览会;
  3. GLUT不是OpenGL的一部分,但是 - 有各种各样的第三方库可以为您绘制原始对象。 GLUT就是其中之一。
  4. Re:glVertex3f和glBegin / glEnd调用。目前,当你学习时,它们很好,这是一种让你研究渲染管道其他部分的简单方法。但是,它们已经被弃用并且不是最理想的,因此不是您想要永久约束的东西。因此,它们不会在OpenGL ES或WebGL中复制。

    CPU和GPU之间的任何通信都会产生相关成本。您在通信中传输的数据越多,成本就越高。但是,由于两个异步和并行设备之间需要临时同步,即使很小的调用也要花费很多。

    因此,glBegin / glVertex3f / glEnd是错误的,因为所有数据都位于CPU上并通过大量调用传递给驱动程序。作为第一步,您可能希望切换到使用glVertexPointer(一步提供所有顶点数据)和glDrawArrays或glDrawElements(一步执行所有glBegin / glEnd调用的等效操作)。从那里你可以转移到通过顶点数组对象将数据存储在GPU而不是CPU上。

答案 1 :(得分:4)

渲染对象只有一种方法,有几种方法可以实现。一种方法是为对象的每个(可见)面描述一个多边形。

在OpenGL 1.x下,这意味着glBeginglVertexglEnd

在OpenGL 2.x下,这意味着glVertexPointerglDrawArrays(但1.x方式仍有效)

在OpenGL 3.x下,这意味着创建一个顶点缓冲区对象,绑定它,glDrawArrays(1.x和2.x方法仅在兼容模式下工作)。

辅助函数(如glutSolidCube)或用于加载模型网格的库在内部使用这些相同的方法。