openGL线型和线宽以及线的抗锯齿

openGL线型和线宽以及线抗锯齿

一、 线宽

Opengl的线宽设置:glLineWidth(width); width为float类型值,在0~10.0,大于10以上按10来处理。

若开启线的反走样glEnable(GL_LINE_SMOOTH);,设置小数值才起作用,否则就四舍五入的处理整数了。

二、  线型

函数为glLineStipple(factor, Pattern[PatternMode]);

其中pattern值可以是任意的你想要的,把01转换为16进制的值就可以了。Factor为缩放因子。

pattern参数是由1或0组成的16位序列,它们根据需要进行重复,对一条特定的直线进行点画处理。从这个模式的低位开始,一个像素一个像素的进行处理。如果模式中对应的位是1,就绘制这个像素,否则就不绘制。模式可以使用factor参数(表示重复因子)进行扩展,它与1和0的连续子序列相乘。因此,如果模式中出现了3个1,并且factor是2,那么它们就扩展为6个连续的1。必须以GL_LINE_STIPPLE为参数调用glEnable()才能启用直线点画功能。

三、线宽代码

<span style="font-size:14px;">void show_width_lines(int width,float red,float green,float blue)
{
	glColor3f(red,green,blue);

	width = 1.0f;
	float PI = 3.1415926;
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glColor3f(red,green,blue);
	//禁用反走样
	glDisable(GL_BLEND);
	glDisable(GL_LINE_SMOOTH);	

	// line_1
	for (int i = 0; i < 8;i++ )
	{
		glLineWidth(width);
		glBegin(GL_LINE_STRIP);
		glVertex3f(5,5*(i+1), 0.0);
		glVertex3f(100,5*(i+1)-qingxie_,0.0);
		glEnd();
		//直线宽度增加0.5
		width += 2.0;
	}

	//启用反走样
	glEnable(GL_BLEND);
	glEnable(GL_LINE_SMOOTH);
	glHint(GL_LINE_SMOOTH_HINT, GL_FASTEST);  // Antialias the lines
	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
	//初始化直线宽度
	width=1.0;
	// line_2
	glColor4f(0,green,0,1.0);
	for (int i = 0; i < 8;i++ )
	{
		glLineWidth(width);
		glBegin(GL_LINE_STRIP);
		glVertex3f(5, 50+1*(i+1), 0.0);
		//glVertex3f(50,50+2*(i+1)-qingxie_, 0.0);
		glVertex3f(80,50+3*(i+1)+qingxie_, 0.0);
		//glVertex3f(100,50+4*(i+1)-qingxie_, 0.0);
		glVertex3f(120,50+5*(i+1)+qingxie_, 0.0);
		glEnd();
		//宽度累加
		width += 2.0;
	}
	glFlush();
}
</span>

四、线型代码

<span style="font-size:14px;">void show_dot_lines(int width,float red,float green,float blue)
{
	int PatternMode = 0;            //线型模式

	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glColor3f(red,green,blue);
	int Pattern[6]=                  //定义了6种线型
	{
		//点线 1000100010001000, 表示实际画线的点,反序后转换成16进制就是0x1111 dotted
		//.  .  .  .  .  .  .  .  .  .  .  .  .  .
		//0x1111,
		0x0101,

		//点划线    1111111111100100  dot dash
		//____ . ____ . _____ . _____. _____
		0x27FF,
		//0x1C47,

		//中心线    1111111111001100  centre line
		//_____ _ _____ _ _____ _ _____ _ _____
		0x33FF,

		//虚线  1111110011111100   dashed
		//____  ____  ____  ____  ____  ____  ____
		0x3F3F,

		//双点划线  1111111100100100  double dot dash
		// ____ . . ____ . . ____ . . ____ . . ____
		0x24FF,

		//三点划线  111111110101010 tri_dot_dash
		// ____ . . ____ . . ____ . . ____ . . ____
		0x55FF
	};

	static float angle = 0.0;

	glEnable(GL_BLEND);
	glEnable(GL_LINE_SMOOTH);
	glEnable(GL_LINE_STIPPLE);
	//初始化直线宽度
	width=2.0;
	// line_2
	glColor3f(0,0,blue);
	for (int i = 0; i<6; i++)
	{
		int PatternMode = i;
		glLineStipple(1, Pattern[PatternMode]);
		glLineWidth(width);
		glBegin(GL_LINES);
		glVertex3f(1,23+i*5, 0.0);
		glVertex3f(50,23+i*5-qingxie_, 0.0);
		glEnd();
	}

	width = 1.0;
	glColor3f(red,0,0);
	for (int i = 0; i<6; i++)
	{
		int PatternMode = i;
		glLineStipple(1, Pattern[PatternMode]);
		glLineWidth(width);
		glBegin(GL_LINES);
		glVertex3f(20,50+i*5, 0.0);
		glVertex3f(50,50+i*5-qingxie_, 0.0);
		glEnd();
	}

	glDisable(GL_LINE_STIPPLE);
	glFlush();

}</span>

五、结果

线的线宽

很明显,绿色线开启反走样,而淡红色的没有。

线型--点划线的实现效果

开启的反走样,为fastest. 当然你可以根据你效果与效率之间选择自己需要的。

六、全部实现代码和工程

<span style="font-size:14px;">
#include <Windows.h>
#include "glew.h"
#pragma comment(lib,"opengl32.lib")
#pragma comment(lib,"glu32.lib")
#pragma comment(lib,"./glew32.lib")
#include <math.h>
//

#include "glut.h"
#include<stdio.h>
#include<stdlib.h>

#define drawOneLine(x1,y1,x2,y2) glBegin(GL_LINES);glVertex3f((x1),(y1),0); glVertex3f((x2),(y2),0);glEnd();

#define  qingxie_  2.0
// function declear
void init (void)
{
	glClearColor (1.0, 1.0, 1.0, 0.0);  // Set display-window color to white.
	glMatrixMode (GL_PROJECTION);       // Set projection parameters.
	gluOrtho2D (0.0, 200.0, 0.0, 150.0);
}

void show_width_lines(int width,float red,float green,float blue)
{
	glColor3f(red,green,blue);

	width = 1.0f;
	float PI = 3.1415926;
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glColor3f(red,green,blue);
	//禁用反走样
	glDisable(GL_BLEND);
	glDisable(GL_LINE_SMOOTH);	

	// line_1
	for (int i = 0; i < 8;i++ )
	{
		glLineWidth(width);
		glBegin(GL_LINE_STRIP);
		glVertex3f(5,5*(i+1), 0.0);
		glVertex3f(100,5*(i+1)-qingxie_,0.0);
		glEnd();
		//直线宽度增加0.5
		width += 2.0;
	}

	//启用反走样
	glEnable(GL_BLEND);
	glEnable(GL_LINE_SMOOTH);
	glHint(GL_LINE_SMOOTH_HINT, GL_FASTEST);  // Antialias the lines
	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
	//初始化直线宽度
	width=1.0;
	// line_2
	glColor4f(0,green,0,1.0);
	for (int i = 0; i < 8;i++ )
	{
		glLineWidth(width);
		glBegin(GL_LINE_STRIP);
		glVertex3f(5, 50+1*(i+1), 0.0);
		//glVertex3f(50,50+2*(i+1)-qingxie_, 0.0);
		glVertex3f(80,50+3*(i+1)+qingxie_, 0.0);
		//glVertex3f(100,50+4*(i+1)-qingxie_, 0.0);
		glVertex3f(120,50+5*(i+1)+qingxie_, 0.0);
		glEnd();
		//宽度累加
		width += 2.0;
	}
	glFlush();
}

void Line3f(GLfloat fromX, GLfloat fromY, GLfloat fromZ,
			GLfloat toX, GLfloat toY, GLfloat toZ)
{
	glBegin(GL_LINES);
	glVertex3f(fromX, fromY, fromZ);
	glVertex3f(toX, toY, toZ);
	glEnd();
}

void show_dot_lines(int width,float red,float green,float blue)
{
	int PatternMode = 0;            //线型模式

	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glColor3f(red,green,blue);
	int Pattern[6]=                  //定义了6种线型
	{
		//点线 1000100010001000, 表示实际画线的点,反序后转换成16进制就是0x1111 dotted
		//.  .  .  .  .  .  .  .  .  .  .  .  .  .
		//0x1111,
		0x0101,

		//点划线    1111111111100100  dot dash
		//____ . ____ . _____ . _____. _____
		0x27FF,
		//0x1C47,

		//中心线    1111111111001100  centre line
		//_____ _ _____ _ _____ _ _____ _ _____
		0x33FF,

		//虚线  1111110011111100   dashed
		//____  ____  ____  ____  ____  ____  ____
		0x3F3F,

		//双点划线  1111111100100100  double dot dash
		// ____ . . ____ . . ____ . . ____ . . ____
		0x24FF,

		//三点划线  111111110101010 tri_dot_dash
		// ____ . . ____ . . ____ . . ____ . . ____
		0x55FF
	};

	static float angle = 0.0;

	glEnable(GL_BLEND);
	glEnable(GL_LINE_SMOOTH);
	glHint(GL_LINE_SMOOTH_HINT, GL_FASTEST);  // 反走样的fastest效果,也可以根据需要选择GL_NICEST.etc.
	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
	glEnable(GL_LINE_STIPPLE);	

	//初始化直线宽度
	width=5.0;
	// line_2
	glColor3f(0,0,blue);
	for (int i = 0; i<6; i++)
	{
		int PatternMode = i;
		glLineStipple(i, Pattern[PatternMode]);
		glLineWidth(width);
		glBegin(GL_LINES);
		glVertex3f(1,23+i*5, 0.0);
		glVertex3f(50,23+i*5-qingxie_, 0.0);
		glEnd();
	}

	width = 1.0;
	glColor3f(red,0,0);
	for (int i = 0; i<6; i++)
	{
		int PatternMode = i;
		glLineStipple(i, Pattern[PatternMode]);
		glLineWidth(width);
		glBegin(GL_LINES);
		glVertex3f(2,50+i*5, 0.0);
		glVertex3f(50,50+i*5-qingxie_, 0.0);
		glEnd();
	}

	glDisable(GL_LINE_STIPPLE);
	glDisable(GL_BLEND);
	glFlush();

}

void pointFun()
{
	float red = 1.0,green = 0.5,blue = 0.5;
	glClear (GL_COLOR_BUFFER_BIT);

	// 去掉注释就可以看线宽效果了。
	//show_width_lines(5,red,green,blue);
	show_dot_lines(5,red,green,blue);
	glFlush();
}

int main (int argc, char** argv)
{
	glutInit (&argc, argv);                         // Initialize GLUT.
	glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);   // Set display mode.
	glutInitWindowPosition (50, 100);   // Set top-left display-window position.
	glutInitWindowSize (1000, 800);      // Set display-window width and height.
	//glutFullScreen();
	glutCreateWindow ("An Example OpenGL Program By Qiu"); // Create display window.
	init();                           // Execute initialization procedure.

	// draw position.
	glTranslatef(50.0f, 50.0f,0.0f);

	glutDisplayFunc (pointFun);       // Send graphics to display window.
	glutMainLoop ( );// Send graphics to display window.                  // Display everything and wait.
	return 0;
}
</span>

工程下载地址:

end

多多指教!

openGL线型和线宽以及线的抗锯齿,布布扣,bubuko.com

时间: 2024-12-16 02:29:14

openGL线型和线宽以及线的抗锯齿的相关文章

OpenGL核心技术之抗锯齿

笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解>电子工业出版社等. CSDN视频网址:http://edu.csdn.net/lecturer/144 抗锯齿问题在游戏中一直存在的,尤其是体现在3D模型上的材质或者游戏UI界面上,由于现在引擎都非常完善,并且引擎都提供了抗锯齿功能,我们通过引擎提供的参数界面设置一下就可以消除.但是很

OpenGL中的抗锯齿技术

计算机通过离散(不连续)的像素来绘制图形,想象一下,真实世界中,我们画直线,是比连续画的,还是一个点一个点画的?计算机就是一个点一个点画的(很小的矩形).这样就会导致绘制的图形走样(锯齿),消除锯齿的技术就叫反走样(抗锯齿) 可以看这篇:http://blog.csdn.net/mikewolf2009/archive/2009/08/18/4460421.aspx 点示例 当点很大时,显示如下 而我们实际想看到的是一个圆点,而不是矩形 启用抗锯齿后的效果 有点圆了 代码 glPointSize

OpenGL中的颜色混合功能(二)——抗锯齿的处理

在OpenGL中,混合功能的另一个用途是抗锯齿的处理.在绝大多数情况下,一个渲染片段映射到计算机屏幕上的一个像素.因为这些像素都是正方形的,所以通常我们可以清晰的看到两种不同颜色的分界,它们就是我们通常所说的锯齿.锯齿的出现会让人觉得图像是不自然的,极为影响观感.这种锯齿现象是计算机所产生的图像的弱点,这对于我们的许多要求尽可能逼真的渲染任务,都带来了消极的影响. 为了消除图元之间的锯齿状边缘,OpenGL使用混合功能来混合片段的颜色,也就是把像素的目标颜色与周围相邻像素的颜色进行混合.从本质上

PHP合成图片、生成文字、居中对齐、画线、矩形、三角形、多边形、图片抗锯齿、不失真 高性能源码示例

function generateImg($source, $text1, $text2, $text3, $font = './msyhbd.ttf') { $date = '' . date ( 'Ymd' ) . '/'; $img = $date . md5 ( $source . $text1 . $text2 . $text3 ) . '.jpg'; if (file_exists ( './' . $img )) { return $img; } $main = imagecrea

如何修改CAD绘图线宽,多线样式管理器

如何修改CAD绘图线宽,多线样式管理器.今天小编就和大家简单探讨一下具体的操作步骤.具体演示步骤如下: 步骤一:多线样式管理器(M) 首先,我们先运行迅捷CAD编辑器专业版软件,点击"格式-多线样式管理器(M)",这时候会弹出弹窗. 步骤二:在多线样式管理器里操作以下2个步骤: 在"多线样式管理器"里,我们点击"standard"右侧的"新建"创建新的多线样式: 在"创建新多线样式"弹窗里,我们点击样式名命

电路板设计线宽、线距规则设置多大

PCB设计线宽.线距规则设置多大比较好? 1.需要要做阻抗的信号线,应该严格按照叠层计算出来的线宽.线距来设置.比如射频信号(常规50R控制).重要单端50R.差分90R.差分100R等信号线,通过叠层可计算出具体的线宽线距(下图示). 2. 设计的线宽线距应该考虑所选PCB生产工厂的生产工艺能力,如若设计时设置线宽线距超过合作的PCB生产厂商的制程能力,轻则需要添加不必要的生产成本,重则导致设计无法生产.一般正常情况下线宽线距控制到6/6mil,过孔选择12mil(0.3mm),基本80%以上

在qt的QOpenGLWidget开启opengl的抗锯齿

在QOpenGLWidget的构造函数添加下面几句代码即可 QSurfaceFormat surfaceFormat; surfaceFormat.setSamples(4);//多重采样 setFormat(surfaceFormat); //setFormat是QOpenGLWidget的函数 参考链接: 在qt的QOpenGLWidget开启opengl的抗锯齿 原文地址:https://www.cnblogs.com/2018shawn/p/11401879.html

回击MLAA:NVIDIA FXAA抗锯齿性能实测、画质对比

PC游戏玩家肯定会对各式各样的AA抗锯齿技术非常熟悉,而今天本文的主角就是NVIDIA今年才推出的新型抗锯齿技术"FXAA". FXAA在某种程度上有些类似于AMD之前宣传的MLAA(形态抗锯齿),但远比后者低调,所以很多玩家可能还从来没听说过,但是如果你玩过<永远的毁灭公爵>或者<F.3.A.R>,应该会有所耳闻.今天我们就来实际测测多款显卡上的FXAA性能和画质表现,并将其与MLAA进行简单对比. 什么是FXAA? FXAA全称为"Fast App

【ShaderToy】抗锯齿相关函数

*示例代码可以直接在ShaderToy中运行. 先上未抗锯齿的两个圆形图案,可以清楚看清图案边缘像素块,即"锯齿". 附代码: void mainImage( out vec4 fragColor, in vec2 fragCoord ) { vec2 r = 2.0*vec2(fragCoord.xy - 0.5*iResolution.xy)/iResolution.y; vec2 center1 = vec2(-0.75,0); vec2 center2 = vec2(0.75,