我是靠谱客的博主 害怕小海豚,最近开发中收集的这篇文章主要介绍opengl绘制 线段并详解函数的用法 002,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一:运行结果

在这里插入图片描述

二: 简化版本的代码

//# 常用opengl函数
// opengl 绘制基本的图形结构--线段
/*
注释者 广都  2022-7-20
有兴趣可以一起讨论

w:wo15985300747
*/

#include <windows.h>
#include <GL/glut.h>
void myglClearColor(double r, double g, double b) { // 自定义函数,可以使用rgb 模式
	glClearColor(r / 255, g / 255, b / 255, 1.0); //蓝色
}

void myglColor3f(double r, double g, double b) {
	glColor3f(r / 255, g / 255, b / 255);
}

#include <math.h>
const GLfloat factor = 0.1f;
void myDisplay_draw_all_type_line(void) {
	myglClearColor(0, 199, 140); // 土耳其蓝
	glClear(GL_COLOR_BUFFER_BIT); //
	myglColor3f(116, 0, 0);// 黑红 设置颜色
	glPointSize(10);  // 设置 点的大小 是 矩形小方块

	glBegin(GL_POINTS);//指定这些顶点的行为为GL_POINTS
	glVertex2f(0.0f, 0.0f);
	glVertex2f(0.5f, 0.0f);
	glEnd();

	glFlush();
}


void draw_sin_line(void) {
	GLfloat x;
	myglClearColor(0, 199, 140); // 土耳其蓝
	glClear(GL_COLOR_BUFFER_BIT);

	myglColor3f(0, 255, 255); // 青色 设置颜色
	glLineWidth(2);
	glBegin(GL_LINES); // 设定为画直线,每两个点为一个坐标系

	glVertex2f(-1.0f, 0.0f);
	glVertex2f(1.0f, 0.0f);         // 以上两个点可以画x轴
	glVertex2f(0.0f, -1.0f);
	glVertex2f(0.0f, 1.0f);         // 以上两个点可以画y轴
	glEnd();
	glBegin(GL_LINE_STRIP);//  GL_LINE_STRIP 不闭合折线

	// 循环划出一系列的点,获得对应的内容
	for (x = -1.0f / factor; x < 1.0f / factor; x = x + 0.01f) {

		glVertex2f(x * factor, sin(x)*factor);
	}

	glEnd();
	glFlush();
}

void Display_line(void) {
	myglClearColor(0, 199, 140); // 土耳其蓝 以 255,255,255 为极限的rgb模式
	glClear(GL_COLOR_BUFFER_BIT); // //清除深度缓冲区

	glEnable(GL_LINE_STIPPLE); // /*执行后,画虚线*/
	//启用反走样
	glEnable(GL_BLEND);
	glEnable(GL_LINE_SMOOTH);
	glLineStipple(0.2, 0x0F0F);
	glLineWidth(10.0f);
	glBegin(GL_LINES); // 使用线条,每两个点为一根线段的端点。
	glVertex2f(0.0f, 0.0f); // 这里需要把相对坐标更改为绝对坐标,给opengl加层,让他们在一个统一平台烟花。
	glVertex2f(0.5f, 0.5f);
	glEnd(); // 线段绘制结束
	glFlush();
}

void myDisplay(void) {
//	draw_sin_line(); // 画出sin曲线
//	myDisplay_draw_all_type_line();
	Display_line();
}

int main(int argc, char *argv[]) {
	HWND winhwnd;
	winhwnd = FindWindow("ConsoleWindowClass", NULL);	//获取窗口句柄

	if (winhwnd) {	//如果找到了
		ShowWindow(winhwnd, SW_HIDE);	//隐藏之
	}

	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
	glutInitWindowPosition(500, 200);
	glutInitWindowSize(800, 600);
	int ax = glutCreateWindow( "OpenGL程序  基本函数解析 画线段 002 ny 广都");
	HWND hWnd =::FindWindow(0, "OpenGL程序  基本函数解析 画线段 002 ny 广都");
	glutDisplayFunc(&myDisplay); // 刷新

	glutMainLoop();
	return 0;

}


三:注释版本代码

//# 常用opengl函数
// opengl 绘制基本的图形结构--线段
/*
注释者 广都  2022-7-20
有兴趣可以一起讨论

w:wo15985300747
*/


#include <windows.h>
#include <GL/glut.h>
// 本身使用的是rgb模式
void myglClearColor(double r, double g, double b) { // 自定义函数,可以使用rgb 模式
	glClearColor(r / 255, g / 255, b / 255, 1.0); //蓝色
}

void myglColor3f(double r, double g, double b) {
	glColor3f(r / 255, g / 255, b / 255);
}



#include <math.h>
const GLfloat factor = 0.1f;



void myDisplay_draw_all_type_line(void) {
	myglClearColor(0, 199, 140); // 土耳其蓝
	glClear(GL_COLOR_BUFFER_BIT); //

//	myglColor3f(107, 142, 35);
//	glRectf(-0.1, -0.2, 0.5f, 0.9f);// 绘制矩形
	myglColor3f(116, 0, 0);// 黑红 设置颜色
	// 必须再glbengin和 glend 之外使用。
	glPointSize(10);  // 设置 点的大小 是 矩形小方块
	//  glLineWidth()  // 设置 线条的宽度

	/*类型 说明
		GL_POINTS 单个顶点集  点集合
		GL_LINES 多组双顶点线段  线段集合
		GL_POLYGON 单个简单填充凸多边形   面集合
		GL_TRAINGLES 多组独立填充三角形
		GL_QUADS 多组独立填充四边形
		GL_LINE_STRIP 不闭合折线
		GL_LINE_LOOP 闭合折线
		GL_TRAINGLE_STRIP 线型连续填充三角形串
		GL_TRAINGLE_FAN 扇形连续填充三角形串
		GL_QUAD_STRIP 连续填充四边形串
	*/

	/*在glBegin()和glEnd()之间可调用的函数
	结构:  函数         函数意义
			glVertex*() 设置顶点坐标
			glColor*() 设置当前颜色
			glIndex*() 设置当前颜色表
			glNormal*() 设置法向坐标
			glCoord*() 产生坐标
			glCallList(),glCallLists() 执行显示列表
			glTexCoord*() 设置纹理坐标
			glEdgeFlag*() 控制边界绘制
			glMaterial*() 设置材质
	*/
	glBegin(GL_POINTS);//指定这些顶点的行为为GL_POINTS
	glVertex2f(0.0f, 0.0f);
	glVertex2f(0.5f, 0.0f);
	glEnd();

	glFlush();
}


void draw_sin_line(void) {
	GLfloat x;
	myglClearColor(0, 199, 140); // 土耳其蓝
	glClear(GL_COLOR_BUFFER_BIT);

	myglColor3f(0, 255, 255); // 青色 设置颜色
	glLineWidth(2);
	glBegin(GL_LINES); // 设定为画直线,每两个点为一个坐标系

	glVertex2f(-1.0f, 0.0f);
	glVertex2f(1.0f, 0.0f);         // 以上两个点可以画x轴
	glVertex2f(0.0f, -1.0f);
	glVertex2f(0.0f, 1.0f);         // 以上两个点可以画y轴
	glEnd();
	glBegin(GL_LINE_STRIP);//  GL_LINE_STRIP 不闭合折线

	// 循环划出一系列的点,获得对应的内容
	for (x = -1.0f / factor; x < 1.0f / factor; x = x + 0.01f) {

		glVertex2f(x * factor, sin(x)*factor);
	}

	glEnd();
	glFlush();
}



void Display_line(void) {
	/*

	*/
	myglClearColor(0, 199, 140); // 土耳其蓝 以 255,255,255 为极限的rgb模式
	glClear(GL_COLOR_BUFFER_BIT); // //清除深度缓冲区

	// glEnable 用于启用各种功能。功能由参数决定。与glDisable相对应。
	// glDisable是用来关闭的。两个函数参数取值是一至的。

	/*
	参数cap的取值
	类型	值	说明
	GL_ALPHA_TEST	4864	跟据函数glAlphaFunc的条件要求来决定图形透明的层度是否显示。
	GL_AUTO_NORMAL	3456	执行后,图形能把光反射到各个方向
	GL_BLEND	3042	启用颜色混合。例如实现半透明效果
	GL_CLIP_PLANE0 ~ GL_CLIP_PLANE5	12288 ~ 12283	根据函数glClipPlane的条件要求
	启用图形切割管道。这里指六种缓存管道
	GL_COLOR_LOGIC_OP	3058	启用每一像素的色彩为位逻辑运算
	GL_COLOR_MATERIAL	2930	执行后,图形(材料)将根据光线的照耀进行反射。
	反射要求由函数glColorMaterial进行设定。
	GL_CULL_FACE	2884	根据函数glCullFace要求启用隐藏图形材料的面。
	GL_DEPTH_TEST	2929	启用深度测试。
	根据坐标的远近自动隐藏被遮住的图形(材料)
	GL_DITHER	3024	启用抖动
	GL_FOG	2912	雾化效果
	例如距离越远越模糊
	GL_INDEX_LOGIC_OP	3057	逻辑操作
	GL_LIGHT0 ~ GL_LIGHT7	16384 ~ 16391	启用0号灯到7号灯(光源)
	光源要求由函数glLight函数来完成
	GL_LIGHTING	2896	启用灯源
	GL_LINE_SMOOTH	2848	执行后,过虑线段的锯齿
	GL_LINE_STIPPLE	2852	执行后,画虚线
	GL_LOGIC_OP	3057	逻辑操作
	GL_MAP1_COLOR_4	3472	根据函数Map1对贝赛尔曲线的设置,
	启用glEvalCoord1,glEvalMesh1,glEvalPoint1
	生成RGBA曲线
	GL_MAP1_INDEX	3473	根据函数Map1对贝赛尔曲线的设置,
	启用glEvalCoord1,glEvalMesh1,glEvalPoint1
	生成颜色索引曲线
	GL_MAP1_NORMAL	3474	根据函数Map1对贝赛尔曲线的设置,
	启用glEvalCoord1,glEvalMesh1,glEvalPoint1
	生成法线
	GL_MAP1_TEXTURE_COORD_1	3475	根据函数Map1对贝赛尔曲线的设置,
	启用glEvalCoord1,glEvalMesh1,glEvalPoint1
	生成文理坐标
	GL_MAP1_TEXTURE_COORD_2	3476	根据函数Map1对贝赛尔曲线的设置,
	启用glEvalCoord1,glEvalMesh1,glEvalPoint1
	生成文理坐标
	GL_MAP1_TEXTURE_COORD_3	3477	根据函数Map1对贝赛尔曲线的设置,
	启用glEvalCoord1,glEvalMesh1,glEvalPoint1
	生成文理坐标
	GL_MAP1_TEXTURE_COORD_4	3478	根据函数Map1对贝赛尔曲线的设置,
	启用glEvalCoord1,glEvalMesh1,glEvalPoint1
	生成文理坐标
	GL_MAP1_VERTEX_3	3479	根据函数Map1对贝赛尔曲线的设置,
	启用glEvalCoord1,glEvalMesh1,glEvalPoint1
	在三维空间里生成曲线
	GL_MAP1_VERTEX_4	3480	根据函数Map1对贝赛尔曲线的设置,
	启用glEvalCoord1,glEvalMesh1,glEvalPoint1
	在四维空间里生成法线
	GL_MAP2_COLOR_4	3504	根据函数Map2对贝赛尔曲线的设置,
	启用glEvalCoord2,glEvalMesh2,glEvalPoint2
	生成RGBA曲线
	GL_MAP2_INDEX	3505	根据函数Map2对贝赛尔曲线的设置,
	启用glEvalCoord2,glEvalMesh2,glEvalPoint2
	生成颜色索引
	GL_MAP2_NORMAL	3506	根据函数Map2对贝赛尔曲线的设置,
	启用glEvalCoord2,glEvalMesh2,glEvalPoint2
	生成法线
	GL_MAP2_TEXTURE_COORD_1	3507	根据函数Map2对贝赛尔曲线的设置,
	启用glEvalCoord2,glEvalMesh2,glEvalPoint2
	生成纹理坐标
	GL_MAP2_TEXTURE_COORD_2	3508	根据函数Map2对贝赛尔曲线的设置,
	启用glEvalCoord2,glEvalMesh2,glEvalPoint2
	生成纹理坐标
	GL_MAP2_TEXTURE_COORD_3	3509	根据函数Map2对贝赛尔曲线的设置,
	启用glEvalCoord2,glEvalMesh2,glEvalPoint2
	生成纹理坐标
	GL_MAP2_TEXTURE_COORD_4	3510	根据函数Map2对贝赛尔曲线的设置,
	启用glEvalCoord2,glEvalMesh2,glEvalPoint2
	生成纹理坐标
	GL_MAP2_VERTEX_3	3511	根据函数Map2对贝赛尔曲线的设置,
	启用glEvalCoord2,glEvalMesh2,glEvalPoint2
	在三维空间里生成曲线
	GL_MAP2_VERTEX_4	3512	根据函数Map2对贝赛尔曲线的设置,
	启用glEvalCoord2,glEvalMesh2,glEvalPoint2
	在三维空间里生成曲线
	GL_NORMALIZE	2977	根据函数glNormal的设置条件,启用法向量
	GL_POINT_SMOOTH	2832	执行后,过虑线点的锯齿
	GL_POLYGON_OFFSET_FILL	32823	根据函数glPolygonOffset的设置,启用面的深度偏移
	GL_POLYGON_OFFSET_LINE	10754	根据函数glPolygonOffset的设置,启用线的深度偏移
	GL_POLYGON_OFFSET_POINT	10753	根据函数glPolygonOffset的设置,启用点的深度偏移
	GL_POLYGON_SMOOTH	2881	过虑图形(多边形)的锯齿
	GL_POLYGON_STIPPLE	2882	执行后,多边形为矢量画图
	GL_SCISSOR_TEST	3089	根据函数glScissor设置,启用图形剪切
	GL_STENCIL_TEST	2960
	GL_TEXTURE_1D	3552	启用一维文理
	GL_TEXTURE_2D	3553	启用二维文理
	GL_TEXTURE_GEN_Q	3171	根据函数glTexGen,启用纹理处理
	GL_TEXTURE_GEN_R	3170	根据函数glTexGen,启用纹理处理
	GL_TEXTURE_GEN_S	3168	根据函数glTexGen,启用纹理处理
	GL_TEXTURE_GEN_T	3169	根据函数glTexGen,启用纹理处理
	*/
	glEnable(GL_LINE_STIPPLE); // /*执行后,画虚线*/
//	glEnable(GL_FOG); // 启动雾化效果

	//启用反走样
	glEnable(GL_BLEND);
	glEnable(GL_LINE_SMOOTH);
	// 反走样定义
	/*
		定义: 在光栅图形显示器上绘制非水平且非垂直的直线或多边形边界时,或多或少会呈现锯齿状或台阶状外观。
		这是因为直线、多边形、色彩边界等是连续的,而光栅则是由离散的点组成,在光栅显示设备上表现直线、多边形等,必须在离散位置采样。
		由于采样不充分重建后造成的信息失真,就叫走样(aliasing)。
		而用于减少或消除这种效果的技术,就称为反走样(antialiasing)。
		OpengL中的反走样采用的是融合的技术,来实现点、线和图形的边沿以及雾和颜色和纹理的插值运算。
		OpenGL实现反走样需要满足两个条件,一是启用混合,二是启用针对几何图元的反走样处理。

		// 这里需要 仔细思考,如何控制反走样, 操作线段的 形状。

	*/


	/*
		pattern:是由1或0组成的16位序列(0x3F07 转二进制0011111100000111),从这个模式的低位开始,一个一个像素地进行处理,如果模型中对应的位是1,就绘制这个像素,否则不绘制。
		factor:为重复因子,它与1和0的连续子序列相乘,如果模式中出现3个1,并且factor是2,那么他们就扩展为6个连续的1.
		如果Pattern为0x3F07 则直线为---     ------  ---     ------  ---     ------
		必须glEnable( GL_LINE_STIPPLE )开启状态,用glDisable( GL_LINE_STIPPLE )禁用状态;
		如果没有开启状态,OpenGL会把pattern当成0xFFFF.

		pattern 这里需要学会,以便我能够控制 线的链接模式
	*/
	glLineStipple(0.2, 0x0F0F);
	/*
	width参数表示光栅化的线段的宽度,缺省值为1.0。glLineWidth函数指定的光栅化的线的宽度对走样线和反走样线均适用。
		和点的效果类似,使用启用反走样处理也影响直线的实际宽度。
	*/
	glLineWidth(10.0f);
	glBegin(GL_LINES); // 使用线条,每两个点为一根线段的端点。
	glVertex2f(0.0f, 0.0f); // 这里需要把相对坐标更改为绝对坐标,给opengl加层,让他们在一个统一平台烟花。
	glVertex2f(0.5f, 0.5f);
	glEnd(); // 线段绘制结束
	glFlush();

}


// opengl可以简单的封装函数,进行各种绘图
void myDisplay(void) {
//	draw_sin_line(); // 画出sin曲线
//	myDisplay_draw_all_type_line();

	Display_line();

}



int main(int argc, char *argv[]) {
	HWND winhwnd;
	winhwnd = FindWindow("ConsoleWindowClass", NULL);	//获取窗口句柄

	if (winhwnd) {	//如果找到了
		ShowWindow(winhwnd, SW_HIDE);	//隐藏之
	}

	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
	glutInitWindowPosition(500, 200);
	glutInitWindowSize(800, 600);
	int ax = glutCreateWindow( "OpenGL程序  基本函数解析 画线段 002 ny 广都");
	HWND hWnd =::FindWindow(0, "OpenGL程序  基本函数解析 画线段 002 ny 广都");
	glutDisplayFunc(&myDisplay); // 刷新

	glutMainLoop();
	return 0;

}




最后

以上就是害怕小海豚为你收集整理的opengl绘制 线段并详解函数的用法 002的全部内容,希望文章能够帮你解决opengl绘制 线段并详解函数的用法 002所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(56)

评论列表共有 0 条评论

立即
投稿
返回
顶部