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. 51Nod 飞行员配对(二分图最大匹配)(匈牙利算法模板题)

    第二次世界大战时期,英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2名飞行员,其中1名是英国飞行员,另1名是外籍飞行员.在众多的飞行员中, ...

  2. 网站平台的favicon.ico的logo

        <link rel="shortcut icon" href="http://www.uuop.com/icotemp/2017061703035984/f ...

  3. javascript 获​取​H​T​M​L​ ​D​O​M​父​,​子​,​临​近​节​点

    在Web应用程序特别是Web2.0程序开发中.常常要获取页面中某个元素,然后更新该元素的样式.内容等.怎样获取要更新的元素,是首先要解决的问题.令人欣慰的是,使用JavaScript获取节点的方法有非 ...

  4. 用 cctld工具创建带有国家代码的IP地址表

    用 cctld工具创建带有国家代码的IP地址表 cctld tools is creating IP addresses table with Country Code 项目地址 https://gi ...

  5. Jodd-vtor验证框架

    VTor是一个编程式验证框架,适用于任意java对象的验证.它是一个快速.微型的.专注于验证的框架.也可以通过注解或者手动设置验证条件.验证条件也可以在profile中分组.VTor是可扩展的,用户很 ...

  6. CF-833B The Bakery(线段树优化Dp)

      Some time ago Slastyona the Sweetmaid decided to open her own bakery! She bought required ingredie ...

  7. git 常用命令(分支)

    查看分支 git branch -r 修改分支名字dev-->test git branch -m dev test 切换分支dev git checkout dev 创建本地分支dev git ...

  8. STM32 之ADC单次转换模式和连续转换模式

    一.背景 在STM32中的AD的单通道采样中可以设置成单次转换模式和连续转换模式,如何理解这两个转换模式的区别,通过程序又是怎样实现的? 二.正文 首先理解单次转换模式,即ADC进行单次转换(单样本) ...

  9. 【Good Bye 2017 B】 New Year and Buggy Bot

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 枚举一下全排列.看看有多少种可以到达终点即可. [代码] #include <bits/stdc++.h> using ...

  10. javascript之Ajax起步

    XMLHttpRequest  readyState属性的值: UNSENT--0--已创建XMLHttpRequest对象. OPENED--1--已调用open方法: HEADERS_RECEIV ...