OpenGL基本图元
2019-09-26 本文已影响0人
叶子丝
图元 | 描述 |
---|---|
GL_POINTS | 每个顶点在屏幕上都是单独点 |
GL_LINES | 每⼀对顶点定义⼀个线段 |
GL_LINE_STRIP | ⼀个从第⼀个顶点依次经过每一个后续顶点而绘制的线条 |
GL_LINE_LOOP | 和GL_LINE_STRIP相同,但是最后⼀个顶点和第⼀个顶点连接起来了. |
GL_TRIANGLES | 每3个顶点定义⼀个新的三⻆形 |
GL_TRIANGLE_STRIP | 共用⼀个条带(strip)上的顶点的一组三⻆形 |
GL_TRIANGLE_FAN | 以一个圆点为中⼼呈扇形排列,共用相邻顶点的一组三角形 |
OpenGL点/线
今天我们将从更底层更基础的角度来详细学习OpenGL图元渲染。点,是最简单的图像。每个特定的顶点在屏幕上都仅仅是一个单独的点。默认的情况下,点的大小是一个像素的大小。
- 修改点的大小
//1.最简单也是最常用的4.0f ,表示点的大小
glPointSize(4.0f) ;
//2.设置点的大小范围和点与点之间的间隔
GLfloat sizes[2] = {2.0f,4.0f};
GLfloat step = 1.0f;
//3.获取点大小范围和最小步长
glGetFloatv(GL_POINT_SIZE_RANGE,sizes);
glGetFloatv(GL_ POINT_GRAULARITY ,&step);
//4.通过使用程序点大小模式来设置点大小
glEnable (GL_ PROGRAM_ POINT_SIZE) ;
//5.这种模式下允许我们]通过编程在顶点着器或几何着色器中设置点大小。着色器内建变量: gl_ PointSize,并且可以在器源码直接写
gl_PointSize = 5.0;
- 设置线段宽度
//6. 设置线段宽度
glLineWidth(2.5f);
OpenGL三角形
对于OpenGL 光栅化最欢迎的是三⻆角形.3个顶点就能构成⼀一个三⻆角形. 三⻆角形类型来⾃自于顶点.并不不是所有的三⻆角形都是正 三⻆角形等.
三角形环绕方式.png
- 在绘制第⼀一个三⻆角形时,线条是按照从V0-V1,再到V2。最后再回到V0的⼀一个闭合三⻆角形。 这个是沿着顶点顺时针⽅方向。这种 顺序与⽅方向结合来指定顶点的⽅方式称为环绕
- 在默认情况下,OpenGL 认为具有逆时针方向环绕的多边形为正面. 这就意味着上图左边是正面,右边是反面。
- 为什么会认为这个问题会很重要了?因为我们常常希望为一个多边形的正面和背面分别设置不同的物理特征。我们可以完全隐藏一个多边形的背面,或者给它设置一种不同的颜色和反射属性。纹理图像在背面三角形中也是相反的。在一个场景中,使所有的多边形保持环绕方向的一致,并使用正面多边形来绘制所有实心物体的表面是非常重要的。
glFrontFace(GL_CW);
GL_CW:告诉OpenGL 顺时针环绕的多边形为正⾯;
GL_CCW:告诉OpenGL 逆时针环绕的多边形为正⾯;
OpenGL 三⻆形带
对于很多表面或者形状⽽言,我们会需要绘制⼏个相连的三⻆形. 这是我们可以使用GL_TRIANGLE_STRIP 图元绘制一串相连三角形,从而节省⼤量的时间。
三角形带.png
优点:
- ⽤前3个顶点指定第1个三⻆形之后,对于接下来的每⼀个三⻆形,只需要再指定1个顶点。需要绘制⼤量的三⻆形时,采⽤这种⽅法可以节省⼤量 、的程序代码和数据存储空间。
- 提供运算性能和节省带宽。更少的顶点意味着数据从内存传输到图形卡的速度更快,并且顶点着⾊器需要处理的次数也更少了。
OpenGL 三⻆形扇
对于很多表面或者形状⽽言,我们会需要绘制几个相连的三⻆形. 这是我们可以使用GL_TRIANGLE_FAN 图元绘制一组围绕一个中⼼点相连的三⻆形。
三角形扇.png
- 上面最左边,有v0、v1、v2三个顶点,这时候再来一个顶点V3,如果要让他变成一个扇形, 采用GL_TRIANGLE_FAN模式,我们公用v1、v2,对于新来的顶点v3,我们把它变成一个三角形,与中心点v0连接起来围绕。
- 再来一个顶点v4,公用v0、v3,连接v4,把它变成一个三角形,就出来最右边第三个图了。
- 增加的顶点会指向中心点,比如顶点v3、v4 指向圆点v0;
OpenGL⼯具类 GLBatch
GLTools库中包含额一个简单的容器类,叫做GLBatch。这个类可以作为7种图元的简单批次容器使用。而且它知道在使用GL_ ShaderManager 支持的任意存储着色器时如何对图元进行渲染。
1. void GLBatch::Begain(GLeunm primitive,GLuint nVerts,GLuint nTexttureUnints = 0);
参数1:图元
参数2:顶点数
参数3:⼀组或者2组纹理坐标(可选)
2. 复制顶点数据(一个由3分量x,y,z顶点组成的数组) 把顶点复制进去
void GLBatch::CopyVerterxData3f(GLfloat *vVerts);
3. 复制表面法线数据
void GLBatch::CopyNormalDataf(GLfloat *vNorms);
4. 复制颜⾊数据
void GLBatch::CopyColorData4f(GLfloat *vColors);
5. 复制纹理坐标数据
void GLBatch::CopyTexCoordData2f(GLFloat *vTextCoords, GLuint uiTextureLayer);
6. 结束数据复制
void GLBatch::End(void);
7. 绘制图形
void GLBatch::Draw(void);
以上有不正确的地方欢迎留言指出,谢谢。