OpenGL 03案例 ----点、线、面、金字塔、伞、手环(一)

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。