OpenGL 03案例 ----点、线、面、金字塔、伞、手环(二)
基本图元
再讲这节课之前,我们讲下图片连接方式。下图就是构建几何图形的几种基本图元:
image.png
图元 | 描述 |
---|---|
GL_POINTS | 每个顶点在屏幕上都是一个单独的点 |
GL_LINES | 每一对顶点定义了一个线段 |
GL_LINE_STRIP | 一个从第一个顶点依次经过每个后续顶点而绘制的线条 |
GL_LINE_LOOP | 和GL_LINE_STRIP相同,但最后一个顶点和第一个顶点也连接了起来 |
GL_TRIANGLES | 每三个顶点定义了一个新的三角形 |
GL_TRIANGLE_STRIP | 共用一个条带(strip)上的顶点的一组三角形 |
GL_TRIANGLE_FAN | 以一个圆点为中心呈扇形排列,共用相邻顶点的一组三角形 |
接下来使用这些基本图元来构建图形。
点
点是最简单的图元,每个特定的顶点在屏幕上显示都仅仅是一个单独的点。下面我就来绘制点,为了跟线、三角形关联起来,我这边就构建三个顶点。
在SetupRC
函数中,定义三个顶点,并加入批次对象中进行处理。
// 定义一些点,三角形形状
GLfloat vCoast[9] = {
3,3,0,0,3,0,3,0,0
};
// 用点的形式 pointBatch是点的批次对象
pointBatch.Begin(GL_POINTS, 3);
pointBatch.CopyVertexData3f(vCoast);
pointBatch.End();
接着在RenderScene
函数中,选择平面着色器来进行绘制图元,这样方便接下来几个图形都适用。为了使点更能够看的清楚,这里使用glPointSize
函数将顶点的像素变为6px。
shaderManager.UseStockShader(GLT_SHADER_FLAT, vBlack);
glPointSize(6.0f);
pointBatch.Draw();
三个点.png
线
两个点构成一条线。每个点都是线段的端点。与点相比我们使用了不同的图元连接方式
// 通过线的形式
lineBatch.Begin(GL_LINES, 3);
这边的图元连接方式用的是GL_LIENS
。
为了使线条看的清楚,在RenderScene
函数中使用函数glLineWidth改变线条宽度。
glLineWidth(2.0f);
线段
看到这样的图形,细心发现,不是定义了三个点吗,怎么只有一根线段?还有下面的个点呢?是不是忘记设置
glPointSize
大小了?
线带
其实上述的问题是因为图元连接方式造成的。GL_LINES只能两个顶点构成一条线段,而且顶点之间是不能共用的。所以只能看到一条线。即使用glPointSize
设置点的大小,在GL_LINES的条件下也没有任何效果。
这时候我们就要用线带来讲三个顶点连成一条线。
线带(line strip)连续地从一个顶点到下个顶点绘制线段,以形成一个真正连接的线条。
这时在RenderScene
函数中采用GL_LINE_STRIP这种连接方式就可以将是三个顶点连成一条线。
// 通过线带的形式
lineStripBatch.Begin(GL_LINE_STRIP, 3);
线带.png
线环
线环(line loop)是线带的一种简单扩展,在线带的基础上额外增加了一条连接着一批次中最后一个顶点和第一个顶点的线段。
// 通过线环的形式
lineLoopBatch.Begin(GL_LINE_LOOP, 3);
线环.png