OpenGL 基本图元

基本图元

截屏2020-07-13 17.55.48.png
  • 这些图元将在一个包含给定图元的所有顶点和相关属性的单个批次中进行渲染
  • 本质:在一个给定的批次中的所有定点都会用于组成这些图元中的一个

基本图元事例

2500437-13ab305aadd4e3d2.png

  • 最简单的图元,每个特定的顶点在屏幕上都仅仅是一个单独的点
  • 默认情况下,点的大小为一个像素
  • 可以调用以下方法改变默认点点大小
void glPointSize(GLfloat size)
注意:并不是所有的点的大小都能够支持的,应该先确认指定点大小是否可用(用以下函数获得点大小的范围及它们之间的最小间隔)
GLfloat sizes[2];//存储支持的点大小范围
GLfloat step;//存储支持的点大小增量

//获取支持的点大小范围和步长(增量)
glGetFloatv(GL_POINT_SIZE_RANCE,sizes);
glGetFloatv(GL_POINT_SIZE_GRANULARITY,&step);

线

  • 比点更进一步的独立的线段
  • 在二个顶点之间绘制的包含偶数个顶点的一批线段且每个顶点都是线段的端点
  • 默认线段的宽度为一个像素
  • 改变线段宽度的函数(唯一方式)
void glLineWidth(GLfloat width);

注意:

  • 线带:连续地从一个顶点到下一个顶点绘制线段,以形成一个真正连接点的线条(GL_LINE_STRIP)
  • 线环:是线带的一种简单扩展,在线带的基础上额外增加了一条连接着一批次中最后一个点和第一个点的线段(GL_LINE_LOOP)

三角形

  • 可能是存在最简单的实体多边形(只有三个边)
  • 光栅化硬件最欢迎三角形(OpenGL中支持的唯一一种多边形)

单独的三角形

1.png

环绕

  • 如上图所示:连接顶点的线段上所示的箭头,无论左右三角形都是按照顶点被指定的顺序(顺时针或逆时针)
  • 环绕:即这种顺序与方向结合来指定顶点的方式(顺时针环绕或逆时针环绕)
2.png

注意:

  • 默认情况:OpenGL认为具有逆时针方向环绕的多边形为正面的(顺时针方向环绕:反面)
  • 对一个多边形的正反面需要设置不同的物理特征(颜色,反射,纹理)
  • 在一个场景中,使所有的多边形保持环绕方向的一致,并使用正面多边形来绘制所有实心物体的外表面是非常重要的
//此函数可以改变以上的默认行为
glFrontFace(GL_CW);
GL_CW(此参数告诉OpenGL顺时针环绕的多边形将被认为是正面)
GL_CCW(此参数把多边形的正面重新恢复为逆时针环绕)

三角形带

  • 对于许多表面和形状来说,我们可能需要绘制几个相连的三角形。可以使用GL_TRIANGLE_STRIP图元绘制一串相连的三家形,从而节省大量的时间
3.png

思考:为什么使用三角形带而不分别指定每个三角形?

  • 优点1:用前三个顶点指定第一个三角形之后,对于接下来的每个三角形,只需要再指定一个顶点(尤其是需要绘制大量的三角形时,采用这种方法可以节省大量的程序代码和数据存储空间)

  • 优点2:提高运算性能和节省带宽(更少的顶点意味着数据从内存传输到图形卡的速度更快,顶点着色器需要进行处理的次数也更少)

三角形扇

  • 可以使用GL_TRIANGLE_FAN创建一组围绕一个中心点点相连三角形
4.png

简单批次容器

  • GLTools库中包含一个简单的容器类,叫GLBatch
  • GLBatch以供7种基本图元简单批次的容器使用,且它知道在使用GLShaderManager支持的任意存储着色器时如何对图元进行渲染的

注意:
OpenGL内部运行机制实际上比这要复杂得多(GLBatch类只是一个便利类)

GLTools使用

1.对批次进行初始化
//包含那种类型图元,顶点数,(可选)一组或二组纹理坐标
void GLBatch::Begin(GLenum primitive, GLuint nVerts, GLuint nTextureUnits = 0);

2.至少要复制一个由3个分量(x,y,z)顶点组成的数组
void GLBatch::CopyVertexData3f(GLfloat *vVerts);
//也可以复制表面法线,颜色和纹理坐标
void GLBatch::CopyNormalDataf(GLfloat *vNorms);
void GLBatch::CopyColorData4f(GLfloat *vColors);
void GLBatch::CopyTexCoordData2f(GLfloat *vTex, GLuint uiTextureLayer);
3.最后结束
void GLBatch::Draw(void);

你可能感兴趣的:(OpenGL 基本图元)