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>
工程下载地址:http://download.csdn.net/detail/cartzhang/7648119
end
多多指教!
openGL线型和线宽以及线的抗锯齿的更多相关文章
- OpenGL ES3使用MSAA(多重采样抗锯齿)的方法
昨晚花费了我2个多小时的时间终于把OpenGL ES3.0中的MSAA给搞定了.在OpenGL ES2.0中,Khronos官方没有引入标准的MSAA全屏抗锯齿的方法,而Apple则采用了自己的GL_ ...
- OpenGL之抗锯齿 以及 线宽的设置
转自原文 OpenGL之抗锯齿 以及 线宽的设置 抗锯齿 1.线的抗锯齿 glEnable(GL_LINE_SMOOTH); //启用 glHint(GL_LINE_SMOOTH,GL_NICEST) ...
- PHP合成图片、生成文字、居中对齐、画线、矩形、三角形、多边形、图片抗锯齿、不失真 高性能源码示例
function generateImg($source, $text1, $text2, $text3, $font = './msyhbd.ttf') { $date = '' . date ( ...
- SolidEdge如何修改线型和线宽
选中一条直线,然后点击如下所示两个按钮,可以分别修改线型和线宽.
- 在qt的QOpenGLWidget开启opengl的抗锯齿
在QOpenGLWidget的构造函数添加下面几句代码即可 QSurfaceFormat surfaceFormat; surfaceFormat.setSamples();//多重采样 setFor ...
- 给Libgdx的ShapeRenderer开启抗锯齿
http://blog.rpsg-team.com/?p=134 ——————————————————————————————————————————————————————————————————— ...
- 回击MLAA:NVIDIA FXAA抗锯齿性能实測、画质对照
PC游戏玩家肯定会对各式各样的AA抗锯齿技术很熟悉,而今天本文的主角就是NVIDIA今年才推出的新型抗锯齿技术"FXAA". FXAA在某种程度上有些类似于AMD之前宣传的MLAA ...
- 【ShaderToy】基础篇之再谈抗锯齿(antialiasing,AA)
写在前面 在之前的基础篇中,我们讲到了在绘制点线时如何处理边缘的锯齿,也就是使用smoothstep函数.而模糊参数是一些定值,或者是跟屏幕分辨率相关的数值,例如分辨率宽度的5%等等.但这种方法其实是 ...
- 【ShaderToy】抗锯齿相关函数
*示例代码可以直接在ShaderToy中运行. *我放在这里咯ShaderToy基础学习中~欢迎交流(ノ>ω<)ノ 先上未抗锯齿的两个圆形图案,可以清楚看清图案边缘像素块,即“锯齿”. 附 ...
随机推荐
- Linux之lldptool命令
1. 描述 当我们想在操作系统里面查看网口和交换机连接的状态信息,我们可以使用lldptool这个工具. 2.LLDP协议 LLDP是一个数据链路层发现协议,LLDP协议使得接入网络的一台设备可以将其 ...
- 洛谷——P2093 零件分组
https://www.luogu.org/problem/show?pid=2093 题目描述 某工厂生产一批棍状零件,每个零件都有一定的长度(Li)和重量(Wi).现在为了加工需要,要将它们分成若 ...
- Python - 字典按值(value)排序
字典安值排序是一个伪命题. 字典本身是不能被排序的, 已经依照关键字(key)排序, 可是列表(list)和元组(tuple)能够排序, 所以字典须要转换列表后排序. 如 import operato ...
- 小白学开发(iOS)OC_ block数据类型(2015-08-08)
// // main.m // block数据类型 // // Created by admin on 15/8/12. // Copyright (c) 2015年 admin. All r ...
- js29--装饰着模式
//装饰者模式:就是在保证不改变原有对象的基础上,去扩展一些想要的方法或去求 var CarInterface = new BH.Interface('CarInterface' , ['getPri ...
- IIS特殊字符设置
简介:[iis7]请求筛选模块被配置为拒绝包含双重转义序列的请求.HTTP 错误 404.11 - Not Found 特殊字符最好替换成其他的字符,主要的特殊字符有”*”.”&”.”%”.” ...
- 模板 Fail树
fail树就是将Trie图的Fail指针反指,从而生成一棵树,这个树的性质是:子节点对应字符串为以当前串为后缀,而子节点为原串的前缀,前缀的后缀就是嵌套在原串中的子串. 模板:BZOJ3172 Des ...
- 5lession-path路径相关操作
今天开始接触到了文件目录.路径方面的知识点.记录如下 先看代码 #!/usr/bin/python # -*- coding: utf-8 -*- import os import sys curre ...
- 1.1 Introduction中 Kafka as a Messaging System官网剖析(博主推荐)
不多说,直接上干货! 一切来源于官网 http://kafka.apache.org/documentation/ Kafka as a Messaging System kafka作为一个消息系统 ...
- ACCESS数据库改名asp或asa
到把mdb改为asp或asa ACCESS数据库:把数据库后缀名改成ASP是防止ACCESS数据库被下载