zl程序教程

您现在的位置是:首页 >  云平台

当前栏目

【OpenGL】十二、OpenGL 绘制线段 ( 绘制单条线段 | 绘制多条线段 | 依次连接的点组成的线 | 绘制圈 | 绘制彩色的线 )

连接 绘制 组成 十二 多条 OpenGL 彩色 单条
2023-06-13 09:17:48 时间

文章目录

一、设置线宽度


线的绘制宽度是 OpenGL 状态机中的一个值 , 通过 glLineWidth 方法设置 ; 下面的代码将线的宽度设置为 2 像素 ;

		// 设置线的宽度 
		glLineWidth(2.0f);

二、绘制单条线段 GL_LINES


绘制线时, 会将从 glBegin 到 glEnd 之间的所有的点都绘制出来 ;

可以调用 glVertex3f 方法设置成对的点 , 每两个点代表一条线 ;

注意必须成对设置 , 如果设置 奇数个点 , 最后一个点会被丢弃 ;

绘制线段时 , glBegin(GL_LINES) 方法传入的参数是 GL_LINES ;

在 glBegin(GL_LINES) 和 glEnd() 之间设置的点 , 会被自动当做线的两个端点 ;

如在上述 glBegin 和 glEnd 两个方法之间调用了

        glVertex3f(0.0f, 0.0f, -10.0f);
        glVertex3f(-5.0f, 0.0f, -10.0f);

代码 , 含义是绘制一条线段 , 端点分别是 (0,0,-10) 和 (-5,0,-10) ;

代码示例 :

		// 渲染场景

		// 清除缓冲区 , 
		// 使用之前设置的 glClearColor(1.0, 0.0, 0.0, 1.0) 擦除颜色缓冲区
		// 红色背景
		glClear(GL_COLOR_BUFFER_BIT);

        // 设置当前的绘制颜色 , 4 个 unsigned byte 
        // 每个颜色的分量占一个字节
        // 参数数据是 R 红色 G 绿色 B 蓝色 A 透明度
        // 下面设置的含义是白色, 绘制点的时候, 每次都使用白色绘制
        glColor4ub(255, 255, 255, 255);

		// 设置线的宽度 
		glLineWidth(2.0f);

        // 绘制线时, 会将从 glBegin 到 glEnd 之间的所有的点都绘制出来
        // 可以调用 glVertex3f 方法 成对 设置多条线
		// 注意必须成对设置 , 如果设置奇数个点 , 最后一个点会被丢弃
        // 绘制线段开始
        glBegin(GL_LINES);

        // 绘制线 , 每两个点组成一条线
		// glVertex3f (GLfloat x, GLfloat y, GLfloat z)
        glVertex3f(0.0f, 0.0f, -10.0f);
        glVertex3f(-5.0f, 0.0f, -10.0f);

		// 上面的设置会从 (0,0,-10) 坐标向 (-5,0,-10) 坐标绘制一条线

        // 绘制点结束
        glEnd();

		// 将后缓冲区绘制到前台
		SwapBuffers(dc);

绘制效果 :

注意 : 设置的点个数必须是偶数的 , 如果设置奇数个点 , 最后一个点会被舍弃 ;

三、绘制多条线段 GL_LINES


绘制线段时 , glBegin(GL_LINES) 方法传入的参数是 GL_LINES ;

在 glBegin(GL_LINES) 和 glEnd() 之间设置的点 , 会被自动当做线的两个端点 , 如果设置 4 个点 , OpenGL 会按照顺序 , 从上到下 , 两两组合成一条线段 ;

如在上述 glBegin 和 glEnd 两个方法之间调用了

        glVertex3f(0.0f, 0.0f, -10.0f);
        glVertex3f(-5.0f, 0.0f, -10.0f);
        
        glVertex3f(-5.0f, 0.0f, -10.0f);
        glVertex3f(-5.0f, -2.0f, -10.0f);

代码 , 含义是 绘制 2 条线段 , 线段 1 端点分别是 (0,0,-10) 和 (-5,0,-10) , 线段 2 端点分别是 (-5,0,-10) 和 (-5, -2, -10) ;

		// 渲染场景

		// 清除缓冲区 , 
		// 使用之前设置的 glClearColor(1.0, 0.0, 0.0, 1.0) 擦除颜色缓冲区
		// 红色背景
		glClear(GL_COLOR_BUFFER_BIT);

        // 设置当前的绘制颜色 , 4 个 unsigned byte 
        // 每个颜色的分量占一个字节
        // 参数数据是 R 红色 G 绿色 B 蓝色 A 透明度
        // 下面设置的含义是白色, 绘制点的时候, 每次都使用白色绘制
        glColor4ub(255, 255, 255, 255);

		// 设置线的宽度 
		glLineWidth(2.0f);

        // 绘制线时, 会将从 glBegin 到 glEnd 之间的所有的点都绘制出来
        // 可以调用 glVertex3f 方法 成对 设置多条线
		// 注意必须成对设置 , 如果设置奇数个点 , 最后一个点会被丢弃
        // 绘制线段开始
        glBegin(GL_LINES);

        // 绘制线 , 每两个点组成一条线
		// glVertex3f (GLfloat x, GLfloat y, GLfloat z)
        glVertex3f(0.0f, 0.0f, -10.0f);
        glVertex3f(-5.0f, 0.0f, -10.0f);

		// 上面的设置会从 (0,0,-10) 坐标向 (-5,0,-10) 坐标绘制一条线

        glVertex3f(-5.0f, 0.0f, -10.0f);
        glVertex3f(-5.0f, -2.0f, -10.0f);
        
		// 上面的设置会从 (-5,0,-10) 坐标向 (-5,-2,-10) 坐标绘制一条线

        // 绘制点结束
        glEnd();

		// 将后缓冲区绘制到前台
		SwapBuffers(dc);

绘制效果 :

四、绘制依次连接的点组成的线 GL_LINE_STRIP


给 glBegin 传入 GL_LINE_STRIP 参数 , 其作用是绘制各个点依次连接的线 , 但是首尾不连接 ;

这里注意与 GL_LINE_LOOP 区别 , GL_LINE_LOOP 设置后 , 在 GL_LINE_STRIP 基础上 , 还要进行首尾连接 ;

代码示例 :

		// 渲染场景

		// 清除缓冲区 , 
		// 使用之前设置的 glClearColor(1.0, 0.0, 0.0, 1.0) 擦除颜色缓冲区
		// 红色背景
		glClear(GL_COLOR_BUFFER_BIT);

        // 设置当前的绘制颜色 , 4 个 unsigned byte 
        // 每个颜色的分量占一个字节
        // 参数数据是 R 红色 G 绿色 B 蓝色 A 透明度
        // 下面设置的含义是白色, 绘制点的时候, 每次都使用白色绘制
        glColor4ub(255, 255, 255, 255);

		// 设置线的宽度 
		glLineWidth(2.0f);

        // 绘制线时, 会将从 glBegin 到 glEnd 之间的所有的点都绘制出来
        // 可以调用 glVertex3f 方法 成对 设置多条线
		// 注意必须成对设置 , 如果设置奇数个点 , 最后一个点会被丢弃
        // 绘制线段开始
        //glBegin(GL_LINES);
        //glBegin(GL_LINE_LOOP);
        glBegin(GL_LINE_STRIP);

        // 绘制线 , 每两个点组成一条线
		// glVertex3f (GLfloat x, GLfloat y, GLfloat z)
        glVertex3f(0.0f, 0.0f, -10.0f);
        glVertex3f(-5.0f, 0.0f, -10.0f);

		// 上面的设置会从 (0,0,-10) 坐标向 (-5,0,-10) 坐标绘制一条线

        glVertex3f(-5.0f, 0.0f, -10.0f);
        glVertex3f(-5.0f, -2.0f, -10.0f);

		// 上面的设置会从 (-5,0,-10) 坐标向 (-5,-2,-10) 坐标绘制一条线

        // 绘制点结束
        glEnd();

		// 将后缓冲区绘制到前台
		SwapBuffers(dc);

效果展示 :

五、绘制圈 GL_LINE_LOOP ( 偶数个点 )


绘制圈时 , 在 glBegin 中传入 GL_LINE_LOOP 参数 , 绘制时会将 glBegin 和 glEnd 之间的点连线 , 并且最后一个点会和第一个点连在一起 , 组成一个圈 ;

代码示例 : 下面的代码与 三 中的代码区别是 , glBegin 中传入的参数是 GL_LINE_LOOP , 不再传入 GL_LINES 参数 ;

		// 渲染场景

		// 清除缓冲区 , 
		// 使用之前设置的 glClearColor(1.0, 0.0, 0.0, 1.0) 擦除颜色缓冲区
		// 红色背景
		glClear(GL_COLOR_BUFFER_BIT);

        // 设置当前的绘制颜色 , 4 个 unsigned byte 
        // 每个颜色的分量占一个字节
        // 参数数据是 R 红色 G 绿色 B 蓝色 A 透明度
        // 下面设置的含义是白色, 绘制点的时候, 每次都使用白色绘制
        glColor4ub(255, 255, 255, 255);

		// 设置线的宽度 
		glLineWidth(2.0f);

        // 绘制线时, 会将从 glBegin 到 glEnd 之间的所有的点都绘制出来
        // 可以调用 glVertex3f 方法 成对 设置多条线
		// 注意必须成对设置 , 如果设置奇数个点 , 最后一个点会被丢弃
        // 绘制线段开始
        //glBegin(GL_LINES);
        glBegin(GL_LINE_LOOP);

        // 绘制线 , 每两个点组成一条线
		// glVertex3f (GLfloat x, GLfloat y, GLfloat z)
        glVertex3f(0.0f, 0.0f, -10.0f);
        glVertex3f(-5.0f, 0.0f, -10.0f);

		// 上面的设置会从 (0,0,-10) 坐标向 (-5,0,-10) 坐标绘制一条线

        glVertex3f(-5.0f, 0.0f, -10.0f);
        glVertex3f(-5.0f, -2.0f, -10.0f);

		// 上面的设置会从 (-5,0,-10) 坐标向 (-5,-2,-10) 坐标绘制一条线

        // 绘制点结束
        glEnd();

		// 将后缓冲区绘制到前台
		SwapBuffers(dc);

绘制效果 : 最后一个点与第一个点连成线段 , 组成一个闭合的三角形 ;

六、绘制圈 GL_LINE_LOOP ( 奇数个点 )


绘制圈时 , 如果设置奇数个点 , 最后一个点也会进行连线 , 如上面的四个点 , 去掉第三个点 , 也可以画出一模一样的图形 ;

		// 渲染场景

		// 清除缓冲区 , 
		// 使用之前设置的 glClearColor(1.0, 0.0, 0.0, 1.0) 擦除颜色缓冲区
		// 红色背景
		glClear(GL_COLOR_BUFFER_BIT);

        // 设置当前的绘制颜色 , 4 个 unsigned byte 
        // 每个颜色的分量占一个字节
        // 参数数据是 R 红色 G 绿色 B 蓝色 A 透明度
        // 下面设置的含义是白色, 绘制点的时候, 每次都使用白色绘制
        glColor4ub(255, 255, 255, 255);

		// 设置线的宽度 
		glLineWidth(2.0f);

        // 绘制线时, 会将从 glBegin 到 glEnd 之间的所有的点都绘制出来
        // 可以调用 glVertex3f 方法 成对 设置多条线
		// 注意必须成对设置 , 如果设置奇数个点 , 最后一个点会被丢弃
        // 绘制线段开始
        //glBegin(GL_LINES);
        glBegin(GL_LINE_LOOP);

        // 绘制线 , 每两个点组成一条线
		// glVertex3f (GLfloat x, GLfloat y, GLfloat z)
        glVertex3f(0.0f, 0.0f, -10.0f);
        glVertex3f(-5.0f, 0.0f, -10.0f);

		// 上面的设置会从 (0,0,-10) 坐标向 (-5,0,-10) 坐标绘制一条线

        //glVertex3f(-5.0f, 0.0f, -10.0f);
        glVertex3f(-5.0f, -2.0f, -10.0f);

		// 上面的设置会从 (-5,0,-10) 坐标向 (-5,-2,-10) 坐标绘制一条线

        // 绘制点结束
        glEnd();

		// 将后缓冲区绘制到前台
		SwapBuffers(dc);

七、绘制彩色的线


在上面 六 的代码基础上 , 在绘制每个点之前 , 都设置当前的颜色值 , 即 OpenGL 状态机中的当前颜色值 ,

第一个点 glVertex3f(0.0f, 0.0f, -10.0f) , 绘制前设置的是 白色 ,

第二个点 glVertex3f(-5.0f, 0.0f, -10.0f) , 绘制前设置的是 绿色 ,

第三个点 glVertex3f(-5.0f, -2.0f, -10.0f) , 绘制前设置的是 蓝色 ;

设置颜色就是在点设置前调用 glColor4ub(0, 0, 255, 255) 方法 , 设置当前颜色 ;

当 白色的点 到 绿色的点 之间连线时 , 颜色会从白色渐变到绿色 ;

代码如下 :

		// 渲染场景

		// 清除缓冲区 , 
		// 使用之前设置的 glClearColor(1.0, 0.0, 0.0, 1.0) 擦除颜色缓冲区
		// 红色背景
		glClear(GL_COLOR_BUFFER_BIT);

        // 设置当前的绘制颜色 , 4 个 unsigned byte 
        // 每个颜色的分量占一个字节
        // 参数数据是 R 红色 G 绿色 B 蓝色 A 透明度
        // 下面设置的含义是白色, 绘制点的时候, 每次都使用白色绘制
        glColor4ub(255, 255, 255, 255);

		// 设置线的宽度 
		glLineWidth(2.0f);

        // 绘制线时, 会将从 glBegin 到 glEnd 之间的所有的点都绘制出来
        // 可以调用 glVertex3f 方法 成对 设置多条线
		// 注意必须成对设置 , 如果设置奇数个点 , 最后一个点会被丢弃
        // 绘制线段开始
        //glBegin(GL_LINES);
		//glBegin(GL_LINE_STRIP);
        glBegin(GL_LINE_LOOP);
        
        // 绘制线 , 每两个点组成一条线
		// glVertex3f (GLfloat x, GLfloat y, GLfloat z)
        glVertex3f(0.0f, 0.0f, -10.0f);

		// 设置绿色 
		glColor4ub(0, 255, 0, 255);

        glVertex3f(-5.0f, 0.0f, -10.0f);

		// 上面的设置会从 (0,0,-10) 坐标向 (-5,0,-10) 坐标绘制一条线

		// 设置蓝色
		glColor4ub(0, 0, 255, 255);

        //glVertex3f(-5.0f, 0.0f, -10.0f);
        glVertex3f(-5.0f, -2.0f, -10.0f);

		glColor4ub(255, 255, 255, 255);

		// 上面的设置会从 (-5,0,-10) 坐标向 (-5,-2,-10) 坐标绘制一条线

        // 绘制点结束
        glEnd();

		// 将后缓冲区绘制到前台
		SwapBuffers(dc);

运行效果如下 :

1

个点白色 , 第

2

个点绿色 , 第

3

个点蓝色 ;

线段

1

白色 ~ 绿色渐变 , 线段

2

绿色 ~ 蓝色渐变 , 线段

3

蓝色 ~ 白色渐变 , 这是 OpenGL 固定管线差值出来的颜色 ;

八、相关资源


GitHub 地址 : https://github.com/han1202012/OpenGL

博客源码快照 : https://download.csdn.net/download/han1202012/14740988