zoukankan      html  css  js  c++  java
  • openGL线型和线宽以及线的抗锯齿

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

    一、 线宽


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

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

    二、  线型


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

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

    pattern参数是由10组成的16位序列,它们根据需要进行重复,对一条特定的直线进行点画处理。从这个模式的低位开始,一个像素一个像素的进行处理。如果模式中对应的位是1,就绘制这个像素,否则就不绘制。模式可以使用factor参数(表示重复因子)进行扩展,它与10的连续子序列相乘。因此,如果模式中出现了31,并且factor2,那么它们就扩展为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>



    工程下载地址:http://download.csdn.net/detail/cartzhang/7648119

    免分源码工程



    end

    多多指教!


  • 相关阅读:
    二维数组
    ASCII_02_扩展
    ASCII_01
    【转】如何监控某个驱动器或目录及其下面的所有子目录的创建文件的动作
    webpack+vue2.0项目 (一) vue-cli脚手架
    分享两个常用的rem布局方式
    移动端border:1px问题解决方案
    sticky footer 布局
    用js数组实现最原始的图片轮播实现
    分享按钮(QQ,微信,微博等)移入动画效果
  • 原文地址:https://www.cnblogs.com/qitian1/p/6461978.html
Copyright © 2011-2022 走看看