1

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

  1. 从任何外部程序(如 3DStudio)导入 3D 网格并将其加载到 opengl
  2. 使用 glVertex3f 创建 6 个多边形
  3. 过剩电话?(我见过 glutSolidCube 但没有像 glutSolidColumn 一样)

我的问题是:

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( );
4

2 回答 2

5

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

  1. 这将是最正常的方式;然而 OpenGL 只是一个渲染库,您可以提供代码来加载您感兴趣的文件格式;
  2. glVertex3f 是一个糟糕的选择;见下文说明;
  3. GLUT 不是 OpenGL 的一部分,但是是的——有多种第三方库可以为您绘制原始对象。过剩就是其中之一。

回复:glVertex3f 和 glBegin/glEnd 调用。目前,当您学习时,它们很好,可以作为一种简单的方法让您研究渲染管道的其他部分。但是,它们已被弃用且次优,因此您不想永久绑定。因此,它们不会在 OpenGL ES 或 WebGL 中复制。

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

因此,glBegin/glVertex3f/glEnd 很糟糕,因为所有数据都位于 CPU 上,并通过大量调用零散地传输到驱动程序。作为第一步,您可能希望切换到使用 glVertexPointer(在一个步骤中提供所有顶点数据)和 glDrawArrays 或 glDrawElements(在一个步骤中执行所有 glBegin/glEnd 调用的等效项)。从那里您可以通过顶点数组对象将数据存储在 GPU 而不是 CPU 上。

于 2011-02-27T21:53:34.530 回答
4

只有一种方法可以渲染一个对象,并且有几种方法可以到达那里。一种方法是为对象的每个(可见)面描述一个多边形。

在 OpenGL 1.x 下,这意味着glBegin, glVertex, glEnd.

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

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

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

于 2011-02-27T21:52:25.590 回答