2

我使用 OpenGL 4.3 编写了一个简单的程序,它显示三角形、四边形和五边形。我在以下数组中定义了我的顶点:

vec2 vertices[NumPoints] = {
    vec2(-1, -0.75), vec2(-0.75, -0.25), vec2(-0.5, -0.75), //Triangle
    vec2(0, -0.25), vec2(0.5, -0.25), vec2(0.5, -0.75), vec2(0, -0.75), //Quad
    vec2(0.25, 0.25), vec2(0.5, 0.5), vec2(0.75, 0.25), vec2(0.65, 0), vec2(0.35, 0) // pentagon
};

为简洁起见,我将省略大部分样板代码。在我的显示功能中,我有以下代码:

glDrawArrays(GL_TRIANGLES, 0, 3); // draw the points
glDrawArrays(GL_TRIANGLE_FAN, 3, 4); //quad
glDrawArrays(GL_TRIANGLE_FAN, 7, 5); //polygon

一切正常,没有任何问题。但是,如果您需要预先确切知道需要多少个顶点,那么创建复杂的场景似乎相当乏味且几乎不可能。我在这里错过了什么吗?另外,如果需要创建一个圆圈,我将如何仅使用 GL_TRIANGLES 来做到这一点?

4

2 回答 2

1

在现实世界的应用程序中,您将拥有场景管理,场景中有多个对象,每个对象有多个子对象。对象负责生成它们的顶点数据和相应的绘图调用并适当地安排它们。

例如,您可以拥有一个具有单一属性的立方体对象 - 边长。从该单一属性中,您可以生成渲染立方体所需的全部顶点集。

您还可以选择将立方体基元转换为另一个兼容的对象,例如具有 3 个属性的框基元 - 高度、宽度和深度,甚至是由面组成的任意多边形网格,这些面由边缘组成由顶点构成。

最好按这样的顺序对不同的场景对象进行排序,以最大限度地减少绘制调用的数量,这是 3D 图形难以解决的典型瓶颈。结合实例化和自适应 LOD,您可以获得显着的性能改进。

对于圆形 - 在原始模式下,绘制它的最有效方法是使用三角形扇形。但是,如果将圆形图元转换为多边形网格,则可以渲染正三角形。绘制圆所需的顶点数将会增加。使用三角形扇,第一个三角形需要 3 个顶点,然后每个附加段只需要 1 个额外顶点,对于正三角形,圆的每个段都需要完整的 3 个顶点。

于 2013-04-12T23:15:25.673 回答
1

我在这里错过了什么吗?

是的。您可以动态分配内存并从文件中读取数据。这就是任何现实世界的程序处理这类事情的方式。您将拥有一些允许从文件加载场景和对象的场景管理结构。文件本身将包含一些元数据,如面数、顶点数等,可用于在运行时准备数据结构。

于 2013-04-13T00:00:54.607 回答