第六节—OpenGL中的基本图元
本文为L_Ares个人写作,包括图片皆为个人亲自操作,以任何形式转载请表明原文出处。
OpenGL中一共有7种基本的图元,代表了7种基本的绘制方式,根据图元的不同,可以将OpenGL中构成图形的三种基本图形扩展成其他的图形。
一、七种基本图元
图元名称 | 图元描述 |
---|---|
GL_POINTS | 每个顶点在屏幕上都是单独的点,没有连接 |
GL_LINES | 每一对顶点(每两个顶点)构成一条线段 |
GL_LINE_STRIP | 从第一个顶点开始,依次(依顶点顺序)连接后一个顶点形成n-1条线段,n为顶点数量 |
GL_LINE_LOOP | 与GL_LINE_STRIP相同的连接顺序,不同点是最后一个顶点和第一个顶点最后需要连接起来形成闭环 |
GL_TRIANGLES | 依照顶点顺序,每三个顶点构成一个三角形 |
GL_TRIANGLE_STRIP | 共用一个条带上的顶点组成新的三角形,从而形成三角形带 |
GL_TARIANGLE_FAN | 以一个顶点为中心,呈扇形排列,共用相邻的两个顶点的三角形扇 |
七种基本图元的名称和描述就是上述,下面的图1.0是对一些常用图元的样式范例。
1.0二、OpenGL构成图形的基本图形
OpenGL中,主要是依靠点、线和三角形构成其他的多种图形。
1. OpenGL的点和线
设置点的大小。最常用也是最简单的方法,在Client中修改点的大小,以设置点大小为4.0f为例:glPointSize(4.0f);
因为OpenGL是一个状态机,所以在使用该方法更改完点的大小之后,记得把点的大小重新设置回1.0f。
下面的三个方法也可以设置点的大小和其他性质,但是都不常用,也没有必要用,权当拓展:
- 设置点的大小范围和点与点之间的距离:
GLfloat sizes[2] = {2.0f,4.0f};
GLfloat step = 1.0f;
- 获取点大小范围和最小步长
glGetFloatv(GL_POINT_SIZE_RANGE,sizes); //大小范围
glGetFloatv(GL_POINT_GRAULARITY,&step); //最小步长
- 通过使用程序点大小模式来设置点大小:
glEnable(GL_PROGRAM_POINT_SIZE);
在着色器中也可以设置点的大小,比如在顶点着色器和几何着色器中,这就是在Server中改变点的大小,使用着色器内建变量:gl_PointSize
,并且可以在着色器源码中直接写:gl_PointSize = 5.0f;
设置线段的宽度,以设置线宽为2.5f为例:glLineWidth(2.5f);
2. OpenGL中的三角形
OpenGL中最受欢迎的就是三角形,因为三角形可以构成任何的图形。这其中就含有三角形扇和三角形带。
在绘制立体图形的时候,我们需要构建图形的正背面,所以三角形的绘制会有正三角形和反三角形的区别。
区别:顶点环绕的顺序。
首先要理解什么是环绕。
环绕:顺序和方向共同指定顶点的连接方式被称之为环绕。
正三角形:逆时针绘制则是正三角形。
反三角形:顺时针绘制则是反三角形。
但是!当不采用正背面剔除的时候,正反都是不会造成影响的。
例1:以为三个顶点,绘制一个三角形。
如下图2.1,顶点的环绕顺序是,则构成顺时针环绕,那么这就是反三角形。
2.1例2:以为三个顶点,绘制一个三角形。
如下图2.2,顶点的环绕顺序是,则构成逆时针环绕,那么这就是正三角形。
2.2在默认的情况下,都是按照顶点顺序逆时针连接则是正三角,按照顶点顺序顺时针连接则是反三角。
但是OpenGL存在可以指定正三角和反三角环绕方式的函数:
glFrontFace(GL_CCW);
参数:
GL_CW
:顺时针环绕的多边形为正多边形。
GL_CCW
:逆时针环绕的多边形为正多边形。(默认方式)
3. 三角形扇和三角形带
图3.1和图3.2是借鉴的图,不是本人创作!!!侵权请联系我,马上删除!!!
三角形扇:利用GL_TRIANGLE_FAN
图元连接方式,所有三角形都以一个顶点为中心点,并且每两个三角形都共用一个边。如下图3.1。
三角形带:利用GL_TRIANGLE_STRIP
图元连接方式,不以某一个顶点为中心环绕成扇,而是每两个三角形公用一边两顶点,另外的顶点独立。如图3.2。
三角形扇和三角形带的优点:
- 除了第一个三角形的三个顶点需要全部指定,后面每一个三角形的顶点都仅需要再指定一个,另外两个共用前一个三角形的。
这在绘制大量的三角形时,可以节省大量的程序代码和数据存储空间。- 提供运算性能,节省带宽。因为更少的顶点意味着数据从内存传输到图形卡的速度更快,意味着顶点着色器执行的次数更少。
三、OpenGL工具类GLBatch
GLBatch是GLTools中的一个简单容器类。可以作为第一小节中7种基础几何图元的简单容器使用。
GLBatch知道在使用GLShaderManager支持的任意存储着色器时,如何对图元进行渲染。
下面是GLBatch批次类的执行流程。顺序对照标号顺序。
1. 对批次进行填充(初始化),告知图元的类型,告知顶点数,告知一组或者两组纹理坐标。
void GLBatch::Begin(GLenum primitive,GLuint nVerts,GLuint nTextureUnits = 0);
参数1:图元种类
参数2:顶点数量
参数3:1组或者2组(可选),纹理坐标
2. 复制顶点数据。至少是一个由三分量组成的数组
void GLBatch::CopyVertexData3f(GLfloat *vVerts);
这一步骤上面,我们还可以根据实际情况选择复制表面法线、颜色、纹理坐标数据。如下:
- 复制表面法线:
void GLBatch::CopyNormalDataf(GLfloat *vNorms);
- 复制颜色:
void GLBatch::CopyColorData4f(GLfloat *vColors);
- 复制纹理坐标:
void GLBatch::CopyTexCoordData2f(GLfloat *vTexCoords,GLuint uiTextureLayer);
3. 结束数据复制,并且设置内部标记,以通知这个类包含哪些属性
void GLBatch::End(void);
4. 绘制图形
GLBatch::Draw(void);
从1到4,就是GLBatch这个简单批次类需要执行的任务和执行顺序。
至此,关于OpenGL中的基本几何图元的基础知识也就结束了。下一节开始撸这些代码。