首页 > 其他分享 >【OpenGL修行】点线面模式设置

【OpenGL修行】点线面模式设置

时间:2023-06-20 11:34:27浏览次数:57  
标签:glVertex2f 修行 OpenGL 0.0 void 0.5 GL 点线面 镂空



文章目录

  • 点的大小切换
  • 线
  • 线的宽窄设置
  • 虚线绘制
  • 多边形
  • 多边形正反绘制&反转
  • 多边形表面剔除
  • 多边形表面镂空
  • 通过初始化数组设置镂空样式
  • 通过读取bmp文件设置镂空样式


点的大小切换

通过glPointSize()函数即可实现点的大小控制,我画了两个大小不同的点,还是挺明显的。

void display1() {//点的大小切换
	glPointSize(5.0f);
	glClear(GL_COLOR_BUFFER_BIT);
	glBegin(GL_POINTS);
	glVertex2f(0.5f, 0.5f);
	glEnd();
	glPointSize(3.0f);
	glBegin(GL_POINTS);
	glVertex2f(0.3f, 0.3f);
	glEnd();
	glFlush();
}

【OpenGL修行】点线面模式设置_顺时针

线

线的宽窄设置

线的宽窄可以通过glLineWidth()函数来进行控制,大家可以通过下面两条线来进行对比。

void display2() {//线的宽窄切换
	glLineWidth(5.0f);
	glClear(GL_COLOR_BUFFER_BIT);
	glBegin(GL_LINES);
	glVertex2f(0.5f, 0.0f);
	glVertex2f(0.0f, 0.8f);
	glEnd();
	glLineWidth(1.0f);
	glBegin(GL_LINES);
	glVertex2f(0.65f, 0.0f);
	glVertex2f(0.1f, 0.9f);
	glEnd();
	glFlush();
}

【OpenGL修行】点线面模式设置_初始化_02

虚线绘制

虚线绘制的时候就需要使用glEnable()来进行虚线模式的开启。

void display3() {//虚线绘制
	glClear(GL_COLOR_BUFFER_BIT);
	glEnable(GL_LINE_STIPPLE);//启动虚线模式
	glLineStipple(2, 0x0f0f);//pattern是由1和0组成的长度为16的序列,从最低位开始看,如果为1,则直线上接下来应该画的factor个点将被画为实的;如果为0,则直线上接下来应该画的factor个点将被画为虚的。
	glBegin(GL_LINES);
	glVertex2f(0.5f, 0.0f);
	glVertex2f(0.0f, 0.8f);
	glEnd();
	glDisable(GL_LINE_STIPPLE);//关闭虚线模式
	glBegin(GL_LINES);
	glVertex2f(0.65f, 0.0f);
	glVertex2f(0.1f, 0.9f);
	glEnd();
	glFlush();
}

【OpenGL修行】点线面模式设置_初始化_03

多边形

多边形正反绘制&反转

一个多边形你可以想象成一个纸片,有正面也有反面,你可以设置他的正反面以及相对应的绘制模式。

glFrontFace(GL_CCW); // 设置CCW方向为“正面”,CCW即CounterClockWise,逆时针
glFrontFace(GL_CW); // 设置CW方向为“正面”,CW即ClockWise,顺时针

void display4(void){//反转
	glClear(GL_COLOR_BUFFER_BIT);
	glPolygonMode(GL_FRONT, GL_FILL);  // 设置正面为填充模式
	glPolygonMode(GL_BACK, GL_LINE);   // 设置反面为线形模式
	glFrontFace(GL_CCW);               // 设置逆时针方向为正面
	glBegin(GL_POLYGON);               // 按逆时针绘制一个正方形,在左下方
	glVertex2f(-0.5f, -0.5f);
	glVertex2f(0.0f, -0.5f);
	glVertex2f(0.0f, 0.0f);
	glVertex2f(-0.5f, 0.0f);
	glEnd();
	glBegin(GL_POLYGON);               // 按顺时针绘制一个正方形,在右上方
	glVertex2f(0.0f, 0.0f);
	glVertex2f(0.0f, 0.5f);
	glVertex2f(0.5f, 0.5f);
	glVertex2f(0.5f, 0.0f);
	glEnd();
	glFlush();
}

【OpenGL修行】点线面模式设置_顺时针_04

多边形表面剔除

有的时候你只需要正面或反面,这时候就可以用到表面剔除。

void display5(void) {//表面剔除
	glClear(GL_COLOR_BUFFER_BIT);
	glEnable(GL_CULL_FACE);//开启剔除模式
	glCullFace(GL_FRONT);//剔除正面
	glPolygonMode(GL_FRONT, GL_FILL);  // 设置正面为填充模式
	glPolygonMode(GL_BACK, GL_LINE);   // 设置反面为线形模式
	glFrontFace(GL_CCW);               // 设置逆时针方向为正面
	glBegin(GL_POLYGON);               // 按逆时针绘制一个正方形,在左下方
	glVertex2f(-0.5f, -0.5f);
	glVertex2f(0.0f, -0.5f);
	glVertex2f(0.0f, 0.0f);
	glVertex2f(-0.5f, 0.0f);
	glEnd();
	glBegin(GL_POLYGON);               // 按顺时针绘制一个正方形,在右上方
	glVertex2f(0.0f, 0.0f);
	glVertex2f(0.0f, 0.5f);
	glVertex2f(0.5f, 0.5f);
	glVertex2f(0.5f, 0.0f);
	glEnd();
	glFlush();
}

【OpenGL修行】点线面模式设置_顺时针_05

多边形表面镂空

通过初始化数组设置镂空样式

直线可以被画成虚线,而多边形则可以进行镂空。
首先,使用glEnable(GL_POLYGON_STIPPLE);来启动镂空模式(使用glDisable(GL_POLYGON_STIPPLE)可以关闭之)。
然后,使用glPolygonStipple来设置镂空的样式。

void glPolygonStipple(const GLubyte *mask);

其中的参数mask指向一个长度为128字节的空间,它表示了一个32*32的矩形应该如何镂空。其中:第一个字节表示了最左下方的从左到右(也可以是从右到左,这个可以修改)8个像素是否镂空(1表示不镂空,显示该像素;0表示镂空,显示其后面的颜色),最后一个字节表示了最右上方的8个像素是否镂空。

void display7(void) {
	static GLubyte Mask[128] =
	{
		 0x00, 0x00, 0x00, 0x00,    //   这是最下面的一行
		 0x00, 0x00, 0x00, 0x00,
		 0x03, 0x80, 0x01, 0xC0,    //   麻
		 0x06, 0xC0, 0x03, 0x60,    //   烦
		 0x04, 0x60, 0x06, 0x20,    //   的
		 0x04, 0x30, 0x0C, 0x20,    //   初
		 0x04, 0x18, 0x18, 0x20,    //   始
		 0x04, 0x0C, 0x30, 0x20,    //   化
		 0x04, 0x06, 0x60, 0x20,    //   ,
		 0x44, 0x03, 0xC0, 0x22,    //   不
		 0x44, 0x01, 0x80, 0x22,    //   建
		 0x44, 0x01, 0x80, 0x22,    //   议
		 0x44, 0x01, 0x80, 0x22,    //   使
		 0x44, 0x01, 0x80, 0x22,    //   用
		 0x44, 0x01, 0x80, 0x22,
		 0x44, 0x01, 0x80, 0x22,
		 0x66, 0x01, 0x80, 0x66,
		 0x33, 0x01, 0x80, 0xCC,
		 0x19, 0x81, 0x81, 0x98,
		 0x0C, 0xC1, 0x83, 0x30,
		 0x07, 0xE1, 0x87, 0xE0,
		 0x03, 0x3F, 0xFC, 0xC0,
		 0x03, 0x31, 0x8C, 0xC0,
		 0x03, 0x3F, 0xFC, 0xC0,
		 0x06, 0x64, 0x26, 0x60,
		 0x0C, 0xCC, 0x33, 0x30,
		 0x18, 0xCC, 0x33, 0x18,
		 0x10, 0xC4, 0x23, 0x08,
		 0x10, 0x63, 0xC6, 0x08,
		 0x10, 0x30, 0x0C, 0x08,
		 0x10, 0x18, 0x18, 0x08,
		 0x10, 0x00, 0x00, 0x08    // 这是最上面的一行
	};
	glClear(GL_COLOR_BUFFER_BIT);
	glEnable(GL_POLYGON_STIPPLE);//开启镂空模式
	glPolygonStipple(Mask);   //设置镂空样式
	glRectf(-0.5f, -0.5f, 0.0f, 0.0f);   // 在左下方绘制一个有镂空效果的正方形
	glDisable(GL_POLYGON_STIPPLE);//关闭镂空模式
	glRectf(0.0f, 0.0f, 0.5f, 0.5f);     // 在右上方绘制一个无镂空效果的正方形
	glFlush();
}

【OpenGL修行】点线面模式设置_顺时针_06

通过读取bmp文件设置镂空样式

用Windows自带的画笔程序新建一副图片,取名为mask.bmp,注意保存为“单色位图”,设置图片的高度和宽度均为32像素。

void display6(void){
	static GLubyte Mask[128];
	FILE* fp;
	fp = fopen("C:/Users/123/Desktop/mask.bmp", "rb");   //黑色表示镂空
	if (!fp)    //未读取到文件
		exit(0);
	// 移动文件指针到这个位置,使得再读sizeof(Mask)个字节就会遇到文件结束
	// 如果直接写-sizeof(Mask)的话,因为sizeof取得的是一个无符号数,取负号会有问题
	if (fseek(fp, -(int)sizeof(Mask), SEEK_END))   
		exit(0);
	// 读取sizeof(Mask)个字节到Mask
	if (!fread(Mask, sizeof(Mask), 1, fp))
		exit(0);
	fclose(fp);
	glClear(GL_COLOR_BUFFER_BIT);
	glEnable(GL_POLYGON_STIPPLE);//开启镂空模式
	glPolygonStipple(Mask);   //设置镂空样式
	glRectf(-0.5f, -0.5f, 0.0f, 0.0f);   // 在左下方绘制一个有镂空效果的正方形
	glDisable(GL_POLYGON_STIPPLE);//关闭镂空模式
	glRectf(0.0f, 0.0f, 0.5f, 0.5f);     // 在右上方绘制一个无镂空效果的正方形
	glFlush();
}

【OpenGL修行】点线面模式设置_Mask_07


参考文献:

http://www.cppblog.com/doing5552/archive/2009/01/08/71532.html


标签:glVertex2f,修行,OpenGL,0.0,void,0.5,GL,点线面,镂空
From: https://blog.51cto.com/u_16165815/6521641

相关文章

  • OpenGL ES 和 OpenGL 版本关系
    本文记录了OpenGL和OpenGLES的版本关系。 ES2.0不向后兼容(notbackwardcompatible),也就是不兼容老版本。ES2.0已经没有固定管线了。ES3.0兼容ES2.0。ES不支持Geometry和Tessellation着色器,但3.0支持feedback模式。ES不支持Antialiasedline. OpenGL版本......
  • [OpenGL]环境搭建以及OpenGL初识
    想往游戏行业发展的话,经常被提及到的就是OpenGL和DirectX,这两者听起来感觉是一门挺高深的技术,今天我也开始摸索学习OpenGL,那么OpenGL到底是什么?它和DirectX有什么区别和联系?OpenGL初识OpenGL只是一套图形函数库DirectX包含图形、声音、输入、网络等模块。但就图形而论,DirectX的图形......
  • Python+OpenGL使用Cohen-Sutherland算法实现直线裁剪
    问题描述:编写Python程序,使用OpenGL实现用于直线裁剪的Cohen-Sutherland算法。运行程序,绘制一个矩形表示裁剪窗口,然后通过鼠标单击和移动来绘制直线,鼠标抬起时对刚刚绘制的直线进行裁剪,显示最终落在裁剪窗口中的部分。关于Cohen-Sutherland算法请自行查阅资料。准备工作:安装和配置Py......
  • OpenGL三角形
    先了解一下一些基础概念图形渲染管线(graphicspipeline)指一堆图形数据输入到一个管道中,经过管道中一些列的处理后将结果展现到屏幕上的过程简单来说可以认为有以下过程,每个阶段的输出都是下一个阶段的输入顶点数据输入————就是输入一些顶点的位置数据,如三角形的顶点之......
  • iOS OpenGL ES FBO 帧缓存区 渲染缓存区详解
    原文地址:https://developer.apple.com/library/content/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/WorkingwithEAGLContexts/WorkingwithEAGLContexts.html#//apple_ref/doc/uid/TP40008793-CH103-SW6绘制到其他渲染目的地Framebuffer对象是渲染命令的目标。......
  • 04 高级OpenGL
    一、深度测试1.深度缓冲深度缓冲记录了屏幕空间内的像素深度(width*height),它会以16、24或32位float的形式储存它的深度值。在大部分的系统中,深度缓冲的精度都是24位的。2.gl_FragCoord对于每一个片段的深度,可以从GL_FragCoord中获取,其xy坐标是屏幕空间的坐标,其z坐标是0......
  • OpenGL学习笔记-3:编译shader报错: cannot convert from 'const highp float' to 'Frag
    报错信息: ERROR::SHADER_COMPILATION_ERRORoftype:FRAGMENTERROR:0:10:'assign':cannotconvertfrom'consthighpfloat'to'FragUserData4-componentvectorofhighpfloat'-------------------------------------------------......
  • OpenGL学习笔记-1:菜鸟入门基础
    一、什么是OpenGL?OpenGL是我们用来操作图形图片等所使用的API,但是其本身并不是API,而是KhronosGroup开发维护的一个规范。Opengl定义了每个函数的入参和出参,具体实现的细节大多数是由显卡厂商完成。二、OpenGL的两种模式OpenGL有两种模式:(1)immediatemode 立即渲......
  • 系统性学习OpenGL的第一天
    在b站上看了ea小哥的教程,opengl本质山是一种api(应用编程接口),也是一种规范。是专门的图形处理api,在许多领域发挥着重要作用。下面是个人的学习经历,2023.5.5,opengl的配置与简单测试。Windows下OpenGL的基本安装与配置(基于VisualStudio2017)安装OpenGL按下“Win+R”,输入“dx......
  • 解决Matlab在Linux下无法使用hardware OpenGL的问题
    解决Matlab在Linux下无法使用hardwareOpenGL的问题1报错信息在命令行使用命令matlab-nodesktop-nosplash启动Matlab时,出现如下报错:MATLABisselectingSOFTWAREOPENGLrendering.在查阅ArchWikiMatlabOpenGLAcceleration栏目后,发现这是因为Matlab未启用OpenGL硬件加......