OpenGL支持的几何图元:

图元类型 描述
GL_POINTS 每个顶点在屏幕上都是一个像素点
GL_LINES 每对顶点定义了一条线段
GL_LINE_STRIP 从第一个顶点开始依次经过后续顶点绘制的线条,
“线段带”
GL_LINE_LOOP 和STRP类似,但首尾相连
GL_TRIANGLES 每三个顶点定义一个三角形
GL_TRIANGLES_STRIP “三角形带”,共用一条带上的顶点的三角形
GL_TRIANGLES_FAN 以一个圆点为中心呈扇形排列,共用相邻顶点。

一、点(GL_POINTS)

最简单图元,每个顶点在屏幕上是一个单独的点,默认大小为1个像素。

  1. glPointSize(GLfloat size); // specify 直径 of rasterized points
  2. // 像素为单位
  3. // 大小不能随意设置,需要确认当前支持的大小范围以及相邻点之间的最小间隔
  4. // OpenGL规范只规定需要支持1个像素大小的点。
  5. // 如果大小超出范围,不会是个错误,会选择那个最近的最大值或者最小值。
  6. GLfloat sizes[2]; // 支持的point size范围(最大、最小)
  7. GLfloat step; // point size 的增量(最小间隔)
  8. // 获取支持的点大小和步长(增量)
  9. glGetFloatv(GL_POINT_SIZE_RANGE, sizes);
  10. glGetFloatv(GL_POINT_SIZE_GRANULARITY, &step);
  11. glEnable(GL_PROGRAM_POINT_SIZE); // 通过着色器设置点大小
  12. // ****************在着色器中
  13. gl_PointSize = 5.0; //在着色器中设置点大小

默认情况下,点不受透视除法影响,离视点近不会更大,离视点远不会更小。
image.png

二、线(GL_LINES)

在两个顶点间绘制,每个顶点是线段的端点。默认情况下,一个像素宽度。
image.png

  1. void glLineWidth( GLfloat widht ); // 设置线宽唯一方式

三、线带(GL_LINE_STRIP)

连续地从上一个顶点到下一个顶点绘制线段。为了绘制这些线条,每个顶点都会被选定两次,第一次作为起点,第二次作为终点。
image.png

四、线环(GL_LINE_LOOP)

线带的基础上,首尾相连。
image.png

五、三角形(GL_TRIANGLES)

image.png
上图是使用GL_TRIANGLES绘制两个三角形,V~V~V顺时针绘制,V3~V4~V5逆时针绘制,这里的数字下标表示这些顶点被指定的顺序。

环绕Winding

image.png
逆时针环绕(Counterclockwise winding)的那一面是三角形的正面(Front facing),顺时针环绕(Clockwise winding)的那一面是三角形的背面(Back facing)。
正面背面之分的意义,一个多边形的正面背面展现不同的物理特性(颜色、反射属性),纹理图像的背面三角形也是相反的。在一个场景中,所有多边形保持环绕方向一致,使用正面多边形来绘制实心物体的外表现是非常重要的。

  1. // 默认值GL_CCW
  2. glFrontFace( GL_CW ); // 顺时针环绕的多边形是正面front face
  3. glFrontFace( GL_CCW ); // 逆时针环绕的多边形是背面front face

六、三角形带(GL_TRIANGLES_STRIP)

image.png
在这种情况中,顶点不一定是按照被指定顺序遍历的(V~V),为了保证每个三角形的环绕一致,实际绘制顺序是:

  • 三角形1:V~V~V(逆时针)
  • 三角形2:V~V~V(逆时针)
  • 三角形3:V~V~V(逆时针)

通过三角形带绘制三角形的优势:

  • 减少程序代码和数据存储空间
    • 绘制相同的三角形,需要的顶点数量更少。
  • 提供运算性能、节省带宽
    • 更少的顶点,意味着更少的数据从内存传输到图形卡,顶点着色器的运行次数也减少。

image.png

七、三角形扇(GL_TRIANGLES_FAN)

下图是通过GL_TRIANGLE_FAN绘制三角形,V0是原点。
image.png
顶点遍历顺序如下:

  • V0~V1~V2
  • V0~V2~V3
  • V0~V3~V4