我使用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?
答案 0 :(得分:1)
在实际应用程序中,您将拥有场景管理,场景中有多个对象,每个对象有多个子对象。对象负责生成顶点数据和相应的绘图调用,并适当地安排它们。
例如,您可以拥有一个具有单个属性的多维数据集对象 - 边长。从该单个属性中,可以生成渲染立方体所需的全部顶点。
您还可以选择将立方体基元转换为另一个兼容对象,例如一个框基元,其中有3个属性 - 高度,宽度和深度,甚至是由面构成的任意多边形网格,由面构成由顶点组成的边。
最好按照这样的顺序对不同的场景对象进行排序,以最大限度地减少绘制调用的次数,这是3D图形的典型瓶颈。结合实例化和自适应LOD,您可以获得显着的性能提升。
对于圆圈 - 在原始模式下,绘制它的最有效方法是使用三角扇。但是,如果将圆基元转换为多边形网格,则可以渲染常规三角形。绘制圆圈所需的顶点数量将增加。使用三角形扇形时,第一个三角形需要3个顶点,然后每个附加区域只需要1个顶点,对于正则三角形,圆形的每个圆弧都需要完整的3个顶点。
答案 1 :(得分:1)
我在这里错过了什么吗?
是。您可以动态分配内存并从文件中读取数据。这就是任何真实世界计划处理这类事情的方式。您将拥有一些场景管理结构,允许从文件加载场景和对象。文件本身将包含一些元数据,如面,顶点等的数量,可用于在运行时准备数据结构。