【转】OpenGL中的基本图元

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是对一些常用图元的样式范例。

二、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中的三角形

扫描二维码关注公众号,回复: 15434578 查看本文章

OpenGL中最受欢迎的就是三角形,因为三角形可以构成任何的图形。这其中就含有三角形扇和三角形带。

在绘制立体图形的时候,我们需要构建图形的正背面,所以三角形的绘制会有正三角形和反三角形的区别。

区别:顶点环绕的顺序。

首先要理解什么是环绕。

环绕:顺序和方向共同指定顶点的连接方式被称之为环绕。

正三角形:逆时针绘制则是正三角形。
反三角形:顺时针绘制则是反三角形。

但是!当不采用正背面剔除的时候,正反都是不会造成影响的。

例1:以V1,V2,V3为三个顶点,绘制一个三角形。

如下图2.1,顶点的环绕顺序是V0->V1->V2->V0,则构成顺时针环绕,那么这就是反三角形。

例2:以V3,V4,V5为三个顶点,绘制一个三角形。

如下图2.2,顶点的环绕顺序是,则构V3->V4->V5->V3成逆时针环绕,那么这就是正三角形。

在默认的情况下,都是按照顶点顺序逆时针连接则是正三角,按照顶点顺序顺时针连接则是反三角。

但是OpenGL存在可以指定正三角和反三角环绕方式的函数:glFrontFace(GL_CCW);

参数:

GL_CW:顺时针环绕的多边形为反多边形。
GL_CCW:逆时针环绕的多边形为正多边形。(默认方式)

3. 三角形扇和三角形带

三角形扇:利用GL_TRIANGLE_FAN图元连接方式,所有三角形都以一个顶点为中心点,并且每两个三角形都共用一个边。如下图3.1。

 三角形带:利用GL_TRIANGLE_STRIP图元连接方式,不以某一个顶点为中心环绕成扇,而是每两个三角形公用一边两顶点,另外的顶点独立。如图3.2。

三角形扇和三角形带的优点:

  1. 除了第一个三角形的三个顶点需要全部指定,后面每一个三角形的顶点都仅需要再指定一个,另外两个共用前一个三角形的。
    这在绘制大量的三角形时,可以节省大量的程序代码和数据存储空间。
  2. 提供运算性能,节省带宽。因为更少的顶点意味着数据从内存传输到图形卡的速度更快,意味着顶点着色器执行的次数更少。

三、OpenGL工具类GLBatch

GLBatch是GLTools中的一个简单容器类。可以作为第一小节中7种基础几何图元的简单容器使用。
GLBatch知道在使用GLShaderManager支持的任意存储着色器时,如何对图元进行渲染。
下面是GLBatch批次类的执行流程。顺序对照标号顺序。

1. 对批次进行填充(初始化),告知图元的类型,告知顶点数,告知一组或者两组纹理坐标。

/*
参数1:图元种类
参数2:顶点数量
参数3:1组或者2组(可选),纹理坐标
*/
void GLBatch::Begin(GLenum primitive,GLuint nVerts,GLuint nTextureUnits = 0);

2. 复制顶点数据。至少是一个由(x,y,z)三分量组成的数组

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这个简单批次类需要执行的任务和执行顺序。

猜你喜欢

转载自blog.csdn.net/u012861978/article/details/130721862