2013-04-12 98 views
2

我用OpenGL 4.3编写了一个简单的程序,它显示了一个三角形,四边形和五边形。我在以下数组中定义了顶点:使用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来做到这一点?

回答

1

在实际应用中,你将有现场管理,与场景和多个子对象为每个对象的多个对象。对象负责生成顶点数据和相应的绘图调用并适当地调度它们。

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

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

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

对于圆形 - 原始模式,最有效的绘制方法是使用三角形风扇。但是,如果将圆形图元转换为多边形网格,则可以呈现正三角形。绘制圆圈所需的顶点数量将增加。随着三角形的球迷,你需要为第一个三角形3个顶点,然后只1每增加部分额外顶,用等边三角形,你将需要完整的3个顶点为圆的每一个角落。

1

我在这里错过了什么吗?

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