看图解析:OpenGL“图元”
2019-05-14 本文已影响0人
Hanfank
看图解析:OpenGL“图元”
一、十种图元类型
OpenGL 中一共有十种基本图元(“元”是基本的意思),每个模型都可以由这十种基本图形组合。
- 点
-
GL_POINTS 单个顶点集(图中未标明)
将指定的各个顶点用于创建单个的点
- 线
-
GL_LINES 多组双顶点线段
将指定顶点用于创建线段。两个顶点指定一条单独的线段。如果顶点个数是奇数,则忽略最后一个 -
GL_LINE_STRIP 不闭合折线
将指定的顶点用于创建线段。每个顶点之后的每个顶点指定的是线条延伸到的下一个点 -
GL_LINE_LOOP 闭合折线
特性和GL_LINE_STRIP相似,只不过最后一条线段是在指定的最后一个和第一个顶点之间绘制。典型情况下,这用于绘制那些可能违反了GL_POLYGON用法规则的封闭区域。
- 三角形
-
GL_TRIANGLES多组独立填充三角形
将指定的顶点用于构造三角形。每三个顶点指定一个新三角形。如果顶点个数不是三的倍数,多余的顶点将被忽略。 -
GL_TRIANGLE_STRIP 线型连续填充三角形
将指定的顶点用于创建三角形。指定前三个顶点之后,后继的每个顶点与它前面两个顶点一起用于构成下一个三角形。每个顶点三元组(在最初的组之后)会自动重新排列以确保三角形绕法的一致性。 -
GL_TRAINGLE_FAN扇形连续填充三角形
将指定的顶点用于构造三角扇形。第一个顶点充当原点,第三个定
- 多边形
-
GL_QUADS多组独立填充四边形
每四个顶点一组用于构造一个四边形。如果顶点个数不是四的倍数,多余的顶点将被忽略 -
GL_QUADS_STRIP连续填充四边形
将指定的顶点用于构造四条形边。在第一对顶点之后,每对顶点定义一个四边形。和GL_QUADS的顶点顺序不一样,每对顶点以指定顺序的逆序使用,以便保证绕法的一致。 -
GL_POLYGON单个简单填充凸多边形
将指定的顶点用于构造一个凸多边形。多边形的边缘决不能相交。最后一个顶点会自动连接到第一个顶点以确保多边形是封闭的。
二、图元绘制方向
- 图元方向默认是逆时针,可以修改为顺时针。
图元方向默认是逆时针
三、 简单绘制图形
- 重点:相同的顶点数,选择不同的绘制方式,产生出不同的图形。
/* -------------- 代码片段 -------------- */
/// 图元对象
GLBatch pointBatch; // 点对象
GLBatch lineBatch; // 两两个点组合线段对象
GLBatch lineStripBatch; // 开口线段对象
GLBatch lineLoopBatch; // 闭口线段对象
void renderScene(void) {
//定义一些点,类似‘佛罗里达州’地图的形状。
GLfloat vCoast[24][3] = {
{2.80, 1.20, 0.0 }, {2.0, 1.20, 0.0 },
{2.0, 1.08, 0.0 }, {2.0, 1.08, 0.0 },
{0.0, 0.80, 0.0 }, {-.32, 0.40, 0.0 },
{-.48, 0.2, 0.0 }, {-.40, 0.0, 0.0 },
{-.60, -.40, 0.0 }, {-.80, -.80, 0.0 },
{-.80, -1.4, 0.0 }, {-.40, -1.60, 0.0 },
{0.0, -1.20, 0.0 }, { .2, -.80, 0.0 },
{.48, -.40, 0.0 }, {.52, -.20, 0.0 },
{.48, .20, 0.0 }, {.80, .40, 0.0 },
{1.20, .80, 0.0 }, {1.60, .60, 0.0 },
{2.0, .60, 0.0 }, {2.2, .80, 0.0 },
{2.40, 1.0, 0.0 }, {2.80, 1.0, 0.0 }};
//用点(GL_POINTS)的形式--表示‘佛罗里达州’地图的形状
pointBatch.Begin(GL_POINTS, 24);
pointBatch.CopyVertexData3f(vCoast);
pointBatch.End();
//通过线(GL_LINES)的形式--表示‘佛罗里达州’地图的形状
lineBatch.Begin(GL_LINES, 24);
lineBatch.CopyVertexData3f(vCoast);
lineBatch.End();
//通过线段(GL_LINE_STRIP)的形式--表示佛罗里达州的形状
lineStripBatch.Begin(GL_LINE_STRIP, 24);
lineStripBatch.CopyVertexData3f(vCoast);
lineStripBatch.End();
//通过线环(GL_LINE_LOOP)的形式--表示‘佛罗里达州’地图的形状
lineLoopBatch.Begin(GL_LINE_LOOP, 24);
lineLoopBatch.CopyVertexData3f(vCoast);
lineLoopBatch.End();
// 交换到缓冲区
glutSwapBuffers();
}
/* -------------- 代码片段 -------------- */
总结
1、OpenGL的图元一共有10种,涵盖点—线—面,顶点数相同,不同的方式,绘制的图形不同。
2、图形绘制是有角度的:默认逆时针,可修改为顺时针