您的位置:首页 > 运维架构

现代OpenGL中,如何使用不同图元类型画一个正方形?

2017-09-03 15:24 274 查看
在以往的OpenGL1.1版本中,要想画一个正方形是比较容易的,院校里大部分计算机图形学课程都是围绕1.1版本来讲的,但是过渡到现代OpenGL以后,画图方式与原先有了很大不同,其中一个重要变化就是图元类型,下面就来看看在现代OpenGL(本文使用4.3版本)中,如何使用不同的图元类型画一个正方形。

首先对比一下新旧版本中图元类型的差异

图元类型OpenGL1.1版枚举量OpenGL4.3版枚举量
多个顶点GL_POINTSGL_POINTS
多组双顶点线段GL_LINESGL_LINES
单个简单填充凸多边形GL_POLYGON取消
多组独立填充三角形GL_TRAINGLESGL_TRAINGLES
多组独立填充四边形GL_QUADS取消
不闭合折线GL_LINE_STRIPGL_LINE_STRIP
闭合折线GL_LINE_LOOPGL_LINE_LOOP
线型连续填充三角形串GL_TRAINGLE_STRIPGL_TRAINGLE_STRIP
扇形连续填充三角形串GL_TRAINGLE_FANGL_TRAINGLE_FAN
连续填充四边形串GL_QUAD_STRIP取消
由上表可以看出,现代OpenGL中取消了和多边形相关的图元类型,因为多边形可以由三角形来绘制,因此,如GL_POLYGON、GL_QUADS、GL_QUAD_STRIP这样的枚举类型在OpenGL4.3中是无效的,在1.1版本中,我们通过下述代码绘制正方形

glBegin(GL_POLYGON);
glVertex3f(0.0,0.0,0.0);
glVertex3f(1.0,0.0,0.0);
glVertex3f(0.0,1.0,0.0);
glVertex3f(1.0,1.0,0.0);
glEnd();


但在4.3版本中,该代码中的glBegin(); glEnd();GL_POLYGON都是无效的,须采用下面的方法绘制,为简化描述,所有绘制均采用无索引模式,无索引,即OpenGL绘图时会一个点接着一个点顺序绘制,这个顺序取决于用户构造顶点数组时顶点的存储顺序,这也是最好理解的一种绘图方式。

【1.采用GL_TRAINGLES图元类型】

在GL_TRAINGLES图元类型下,因为采用了无索引方式,所以每个三角形的顶点都需表达出来,画一个正方形需要6个顶点,即两个三角形,点的位置示意图如下:



其中,3、4点位置重合,2、5点位置重合,由两个三角形拼成一个正方形,为了方便观察,第一个三角形设置为红色,第二个三角形设置为蓝色。

float vertex[6][4] = {
{0.0f, 0.0f, 0.0f, 1.0f},//0号属性(顶点坐标),6个点坐标,齐次坐标
{1.0f, 0.0f, 0.0f, 1.0f},
{0.0f, 1.0f, 0.0f, 1.0f},
{1.0f, 0.0f, 0.0f, 1.0f},
{1.0f, 1.0f, 0.0f, 1.0f},
{0.0f, 1.0f, 0.0f, 1.0f}
};
float color[6][4] = {
{1.0f, 0.0f, 0.0f, 1.0f},
{1.0f, 0.0f, 0.0f, 1.0f},//1号属性(顶点颜色),6个点的颜色,齐次坐标
{1.0f, 0.0f, 0.0f, 1.0f},
{0.0f, 0.0f, 1.0f, 1.0f},
{0.0f, 0.0f, 1.0f, 1.0f},
{0.0f, 0.0f, 1.0f, 1.0f}
};




【2.采用GL_TRAINGLE_STRIP图元类型】

在GL_TRAINGLE_STRIP图元类型下,同样是无索引模式,画一个正方形需要4个顶点,前一个三角形的最后两个顶点会和下一个点自动构成一个新的三角形,第一个三角形为纯红色,第二个三角形为红蓝过渡色,点的位置示意图如下:



float vertex[4][4] = {
{0.0f, 0.0f, 0.0f, 1.0f},//0号属性(顶点坐标),4个点坐标,齐次坐标
{1.0f, 0.0f, 0.0f, 1.0f},
{0.0f, 1.0f, 0.0f, 1.0f},
{1.0f, 1.0f, 0.0f, 1.0f}

4000
};
float color[4][4] = {
{1.0f, 0.0f, 0.0f, 1.0f},
{1.0f, 0.0f, 0.0f, 1.0f},//1号属性(顶点颜色),4个点的颜色,齐次坐标
{1.0f, 0.0f, 0.0f, 1.0f},
{0.0f, 0.0f, 1.0f, 1.0f},
};




上述内容只讨论了图元类型变化所带来的影响,要想编写出完整的代码,新旧版本OpenGL还有很多其它方面的差别,本文旨在强调的一点是:旧的多边形构造思维已经不再适用,在构造更复杂的几何形体时,一定要采用三角形的思维来构造,虽然有时这会带来更多的工作量,但这种原理更具有普适性,编程也更加灵活。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  opengl
相关文章推荐