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>

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

免分源码工程

end

多多指教!

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

  1. OpenGL ES3使用MSAA(多重采样抗锯齿)的方法

    昨晚花费了我2个多小时的时间终于把OpenGL ES3.0中的MSAA给搞定了.在OpenGL ES2.0中,Khronos官方没有引入标准的MSAA全屏抗锯齿的方法,而Apple则采用了自己的GL_ ...

  2. OpenGL之抗锯齿 以及 线宽的设置

    转自原文 OpenGL之抗锯齿 以及 线宽的设置 抗锯齿 1.线的抗锯齿 glEnable(GL_LINE_SMOOTH); //启用 glHint(GL_LINE_SMOOTH,GL_NICEST) ...

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

    function generateImg($source, $text1, $text2, $text3, $font = './msyhbd.ttf') { $date = '' . date ( ...

  4. SolidEdge如何修改线型和线宽

    选中一条直线,然后点击如下所示两个按钮,可以分别修改线型和线宽.    

  5. 在qt的QOpenGLWidget开启opengl的抗锯齿

    在QOpenGLWidget的构造函数添加下面几句代码即可 QSurfaceFormat surfaceFormat; surfaceFormat.setSamples();//多重采样 setFor ...

  6. 给Libgdx的ShapeRenderer开启抗锯齿

    http://blog.rpsg-team.com/?p=134 ——————————————————————————————————————————————————————————————————— ...

  7. 回击MLAA:NVIDIA FXAA抗锯齿性能实測、画质对照

    PC游戏玩家肯定会对各式各样的AA抗锯齿技术很熟悉,而今天本文的主角就是NVIDIA今年才推出的新型抗锯齿技术"FXAA". FXAA在某种程度上有些类似于AMD之前宣传的MLAA ...

  8. 【ShaderToy】基础篇之再谈抗锯齿(antialiasing,AA)

    写在前面 在之前的基础篇中,我们讲到了在绘制点线时如何处理边缘的锯齿,也就是使用smoothstep函数.而模糊参数是一些定值,或者是跟屏幕分辨率相关的数值,例如分辨率宽度的5%等等.但这种方法其实是 ...

  9. 【ShaderToy】抗锯齿相关函数

    *示例代码可以直接在ShaderToy中运行. *我放在这里咯ShaderToy基础学习中~欢迎交流(ノ>ω<)ノ 先上未抗锯齿的两个圆形图案,可以清楚看清图案边缘像素块,即“锯齿”. 附 ...

随机推荐

  1. angular入门(基础篇)

    一.什么是AngularJs? AngularJs是一个JavaScript框架,通过指令扩展了HTML,并且通过表达式绑定数据到HTML. AngularJs使得开发现代的单页面应用程序(SPA:S ...

  2. Model、ModelMap、ModelAndView的作用及区别

    Model.ModelMap.ModelAndView的作用及区别 对于MVC框架,控制器controller执行业务逻辑 用于产生模型数据Model 视图view用来渲染模型数据 Model和Mod ...

  3. 阅读笔记—MVC

    MVC设计模式 Model 1 体系结构 在Model 1 体系结构中,每一个请求的目标都是JSP页面.JSP页面负责完成请求所需要的而所有任务,其中包括验证客户.使用JavaBeans访问数据库及管 ...

  4. Qt样式表——选择器详解(父子关系)

    在上一节中,小豆君给大家介绍了样式表的基本概念和大致用法.今天我们来详细了解下样式表中选择器的用法. 所谓选择器,就是指定你所设置的样式对哪个或哪些控件起作用. 到目前为止,Qt样式表支持CSS2中定 ...

  5. ubuntu-文件管理、编辑

    1.创建单层文件夹 mkdir test 如果你想要创建多层文件夹,这时候你需要添加一个参数-p mkdir -p t1/t2/t3 如果你不加-p的话,它会提示说找不到目录 2.分屏查看内容 mor ...

  6. php实现排列组合

    php实现排列组合 一.总结 1.回溯:回溯的函数参数有些生疏了,记录递归的位置(pos或step),还要有东西(vis数组)来记录这个是否已经被访问 2.php全局变量的使用 :外部定义的普通变量, ...

  7. CSS min-height不能解决垂直外边距合并问题

    垂直外边距合并有一种情况是嵌套元素的垂直外边距合并,当父级元素没有设定外边距时,在顶部或者底部边缘的子元素的垂直外边距就会和父级的合并,导致父级也有了“隐形”的垂直外边距. 当父级元素的min-hei ...

  8. BZOJ3238: [Ahoi2013]差异(后缀数组)

    Description Input 一行,一个字符串S Output 一行,一个整数,表示所求值 Sample Input cacao Sample Output 54 解题思路: 看到lcp,想到了 ...

  9. System.out.println 的多线程并发问题

    假设println函数的參数为常量则不会出现线程并发问题,可是假设參数为表达式形式.则JVM在运行println函数的时候会分为几步来运行,从而造成并发问题. 例如以下样例所看到的: package ...

  10. [Angular] Custom directive Form validator

    Create a directive to check no special characters allowed: import {Directive, forwardRef} from '@ang ...