OpenGL支持的几何图元:
图元类型 | 描述 |
---|---|
GL_POINTS | 每个顶点在屏幕上都是一个像素点 |
GL_LINES | 每对顶点定义了一条线段 |
GL_LINE_STRIP | 从第一个顶点开始依次经过后续顶点绘制的线条, “线段带” |
GL_LINE_LOOP | 和STRP类似,但首尾相连 |
GL_TRIANGLES | 每三个顶点定义一个三角形 |
GL_TRIANGLES_STRIP | “三角形带”,共用一条带上的顶点的三角形 |
GL_TRIANGLES_FAN | 以一个圆点为中心呈扇形排列,共用相邻顶点。 |
一、点(GL_POINTS)
最简单图元,每个顶点在屏幕上是一个单独的点,默认大小为1个像素。
glPointSize(GLfloat size); // specify 直径 of rasterized points
// 像素为单位
// 大小不能随意设置,需要确认当前支持的大小范围以及相邻点之间的最小间隔
// OpenGL规范只规定需要支持1个像素大小的点。
// 如果大小超出范围,不会是个错误,会选择那个最近的最大值或者最小值。
GLfloat sizes[2]; // 支持的point size范围(最大、最小)
GLfloat step; // point size 的增量(最小间隔)
// 获取支持的点大小和步长(增量)
glGetFloatv(GL_POINT_SIZE_RANGE, sizes);
glGetFloatv(GL_POINT_SIZE_GRANULARITY, &step);
glEnable(GL_PROGRAM_POINT_SIZE); // 通过着色器设置点大小
// ****************在着色器中
gl_PointSize = 5.0; //在着色器中设置点大小
默认情况下,点不受透视除法影响,离视点近不会更大,离视点远不会更小。
二、线(GL_LINES)
在两个顶点间绘制,每个顶点是线段的端点。默认情况下,一个像素宽度。
void glLineWidth( GLfloat widht ); // 设置线宽唯一方式
三、线带(GL_LINE_STRIP)
连续地从上一个顶点到下一个顶点绘制线段。为了绘制这些线条,每个顶点都会被选定两次,第一次作为起点,第二次作为终点。
四、线环(GL_LINE_LOOP)
五、三角形(GL_TRIANGLES)
上图是使用GL_TRIANGLES绘制两个三角形,V~V~V顺时针绘制,V3~V4~V5逆时针绘制,这里的数字下标表示这些顶点被指定的顺序。
环绕Winding
逆时针环绕(Counterclockwise winding)的那一面是三角形的正面(Front facing),顺时针环绕(Clockwise winding)的那一面是三角形的背面(Back facing)。
正面背面之分的意义,一个多边形的正面背面展现不同的物理特性(颜色、反射属性),纹理图像的背面三角形也是相反的。在一个场景中,所有多边形保持环绕方向一致,使用正面多边形来绘制实心物体的外表现是非常重要的。
// 默认值GL_CCW
glFrontFace( GL_CW ); // 顺时针环绕的多边形是正面front face
glFrontFace( GL_CCW ); // 逆时针环绕的多边形是背面front face
六、三角形带(GL_TRIANGLES_STRIP)
在这种情况中,顶点不一定是按照被指定顺序遍历的(V~V),为了保证每个三角形的环绕一致,实际绘制顺序是:
- 三角形1:V~V~V(逆时针)
- 三角形2:V~V~V(逆时针)
- 三角形3:V~V~V(逆时针)
通过三角形带绘制三角形的优势:
- 减少程序代码和数据存储空间
- 绘制相同的三角形,需要的顶点数量更少。
- 提供运算性能、节省带宽
- 更少的顶点,意味着更少的数据从内存传输到图形卡,顶点着色器的运行次数也减少。
七、三角形扇(GL_TRIANGLES_FAN)
下图是通过GL_TRIANGLE_FAN绘制三角形,V0是原点。
顶点遍历顺序如下:
- V0~V1~V2
- V0~V2~V3
- V0~V3~V4