现代OpenGL中,如何使用不同图元类型画一个正方形?
2017-09-03 15:24
274 查看
在以往的OpenGL1.1版本中,要想画一个正方形是比较容易的,院校里大部分计算机图形学课程都是围绕1.1版本来讲的,但是过渡到现代OpenGL以后,画图方式与原先有了很大不同,其中一个重要变化就是图元类型,下面就来看看在现代OpenGL(本文使用4.3版本)中,如何使用不同的图元类型画一个正方形。
首先对比一下新旧版本中图元类型的差异
由上表可以看出,现代OpenGL中取消了和多边形相关的图元类型,因为多边形可以由三角形来绘制,因此,如GL_POLYGON、GL_QUADS、GL_QUAD_STRIP这样的枚举类型在OpenGL4.3中是无效的,在1.1版本中,我们通过下述代码绘制正方形
但在4.3版本中,该代码中的glBegin(); glEnd();GL_POLYGON都是无效的,须采用下面的方法绘制,为简化描述,所有绘制均采用无索引模式,无索引,即OpenGL绘图时会一个点接着一个点顺序绘制,这个顺序取决于用户构造顶点数组时顶点的存储顺序,这也是最好理解的一种绘图方式。
【1.采用GL_TRAINGLES图元类型】
在GL_TRAINGLES图元类型下,因为采用了无索引方式,所以每个三角形的顶点都需表达出来,画一个正方形需要6个顶点,即两个三角形,点的位置示意图如下:
其中,3、4点位置重合,2、5点位置重合,由两个三角形拼成一个正方形,为了方便观察,第一个三角形设置为红色,第二个三角形设置为蓝色。
【2.采用GL_TRAINGLE_STRIP图元类型】
在GL_TRAINGLE_STRIP图元类型下,同样是无索引模式,画一个正方形需要4个顶点,前一个三角形的最后两个顶点会和下一个点自动构成一个新的三角形,第一个三角形为纯红色,第二个三角形为红蓝过渡色,点的位置示意图如下:
上述内容只讨论了图元类型变化所带来的影响,要想编写出完整的代码,新旧版本OpenGL还有很多其它方面的差别,本文旨在强调的一点是:旧的多边形构造思维已经不再适用,在构造更复杂的几何形体时,一定要采用三角形的思维来构造,虽然有时这会带来更多的工作量,但这种原理更具有普适性,编程也更加灵活。
首先对比一下新旧版本中图元类型的差异
图元类型 | OpenGL1.1版枚举量 | OpenGL4.3版枚举量 |
---|---|---|
多个顶点 | GL_POINTS | GL_POINTS |
多组双顶点线段 | GL_LINES | GL_LINES |
单个简单填充凸多边形 | GL_POLYGON | 取消 |
多组独立填充三角形 | GL_TRAINGLES | GL_TRAINGLES |
多组独立填充四边形 | GL_QUADS | 取消 |
不闭合折线 | GL_LINE_STRIP | GL_LINE_STRIP |
闭合折线 | GL_LINE_LOOP | GL_LINE_LOOP |
线型连续填充三角形串 | GL_TRAINGLE_STRIP | GL_TRAINGLE_STRIP |
扇形连续填充三角形串 | GL_TRAINGLE_FAN | GL_TRAINGLE_FAN |
连续填充四边形串 | GL_QUAD_STRIP | 取消 |
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还有很多其它方面的差别,本文旨在强调的一点是:旧的多边形构造思维已经不再适用,在构造更复杂的几何形体时,一定要采用三角形的思维来构造,虽然有时这会带来更多的工作量,但这种原理更具有普适性,编程也更加灵活。
相关文章推荐
- 数据类型和抽象数据类型是如何定义的。二者有何相同和不同之处,抽象数据类型的主要特点是什么?使用抽象数据类型的主要好处是什么?
- 【转载】如何在 Windows Phone 应用程序的一个 Pivot 控件中使用不同的应用程序栏
- 如何正确使用不同类型的WSDL文件
- 如何控制同一一个订单类型的使用多个号码范围
- 如何成为一个现代程序员:使用你的CPU,而不是内存
- 一个使用泛型堆栈模块创建的两个容纳不同类型数据的实例
- 如何将一个类型在FOREACH中使用
- Mybatis深入-如何使用传递不同类型的参数(以及等量替换符号的使用)
- [Groovy]如何定义和使用一个Java里的Enum类型
- 在一个应用中,如何针对不同的外部客户系统,使用不同的数字证书?
- 如何使用软件的方法来查找一个QML的类型的所有的property
- Visual C#2005——如何使用ToArray方法返回一个强类型数组
- 如何在不同的电脑上使用同一个git账号
- yii 如何在一个控制器里给不同的action使用不同的布局
- Visual C#2005——如何使用ToArray方法返回一个强类型数组
- 如何在一个链表中链入不同类型的对象
- 12个球,外形相同,其中有一个球重量与其余11球不同,如何使用天平尽量少次数的测量找出这个小球且判别它比正常球轻还是重
- 如何在同一个页面内使用不同的超级链接,如何定义这类CSS。
- 如何成为一个现代程序员: 使用你的CPU, 而不是内存
- 如何在 Windows Phone 应用程序的一个 Pivot 控件中使用不同的应用程序栏