openGL研究钞四 : 关于颜色, 尺寸, 虚线, 多边形逆转, 空洞, 使用位图
转载请保留源,,,,hushuai1992http://blog.csdn.net/u013642494/article/category/2675731
额。 这个标题我都不知道该怎么起了。 假设没有标题。 请不要在意这些细节。
。。。。
我们看看上次我们画的点、以及线, 我们似乎忘了说怎样设置点的大小( 哦。 不正确, 我似乎是说了后面来说的。。。。)。 如今我们来看看
一 设置点的大小和线的粗细
void glPointSize (GLfloat size);//设置点的大小, 默觉得一个像素
void glLineWidth (GLfloat width);//设置线的宽度
注意, 这两个函数都要在glBegin()之前使用。 在glBegin()之后使用无效
并且必需要开启反走样(glEnable(GL_LINE_SMOOTH);)了之后才干够使用小数哦
看看代码:
void display()
{
glClear( GL_COLOR_BUFFER_BIT);
glPointSize( 20.0f);
glBegin( GL_POINTS);
glVertex2f( 0.0f, 0.0f);
glEnd(); glLineWidth( 5.0f);
glBegin( GL_LINES);
glVertex2f( -0.5f, -0.5f);
glVertex2f( 1.0f, -0.5f);
glEnd();
glFinish();
}
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzY0MjQ5NA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
二 设置颜色
预计小伙伴们都猜到了吧
void glColor3f (GLfloat red, GLfloat green, GLfloat blue);//设置颜色
void glColor4f (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);//设置颜色。 带透明通道
只是这里的參数不是[0,255], 而是[0,1]。
线性映射等浮点值表示的最大值映射到1.0(全强度),和零映射到0.0(零点强度)。
採用f和d做后缀的函数,以1.0表示最大的使用。
採用b做后缀的函数。以127表示最大的使用。
採用ub做后缀的函数,以255表示最大的使用。
採用s做后缀的函数。以32767表示最大的使用。
採用us做后缀的函数。以65535表示最大的使用。
void display()
{
glClear( GL_COLOR_BUFFER_BIT);
glEnable(GL_BLEND); // 打开混合
glDisable(GL_DEPTH_TEST); // 关闭深度測试
glBlendFunc(GL_SRC_ALPHA, GL_ONE); // 基于源象素alpha通道值的半透明混合函数
glColor3f( 0.0f, 1.0f, 0.0f);
glPointSize( 20.0f);
glBegin( GL_POINTS);
glVertex2f( 0.0f, 0.0f);
glEnd(); glColor4f( 1.0f, 0.0f, 0.0f, 0.5f);
glLineWidth( 5.0f);
glBegin( GL_LINES);
glVertex2f( -0.5f, -0.5f);
glVertex2f( 0.5f, 0.5f);
glEnd();
glFinish();
}
小伙伴们都注意一下哈, 假设需要使用透明通道, 必需要打开ALPHA混合器,并指定源与目标的混合方式。看这几句代码
glEnable(GL_BLEND); // 打开混合
glDisable(GL_DEPTH_TEST); // 关闭深度測试
glBlendFunc(GL_SRC_ALPHA, GL_ONE); // 基于源象素alpha通道值的半透明混合函数
void glEnable(GLenum cap);//用来开启各项功能
当然, 相相应的肯定就有关闭各项功能glDisable()
我们看看以下的參数
|
类型
|
值
|
说明
|
|
GL_ALPHA_TEST
|
4864
|
依据函数glAlphaFunc的条件要求来决定图形透明的层度是否显示。
详细參见glAlphaFunc |
|
GL_AUTO_NORMAL
|
3456
|
运行后,图形能把光反射到各个方向
|
|
GL_BLEND
|
3042
|
启用颜色混合。比如实现半透明效果
|
|
GL_CLIP_PLANE0 ~ GL_CLIP_PLANE5
|
12288 ~ 12283
|
依据函数glClipPlane的条件要求 启用图形分割管道。这里指六种缓存管道
|
|
GL_COLOR_LOGIC_OP
|
3058
|
启用每一像素的色彩为位逻辑运算
|
|
GL_COLOR_MATERIAL
|
2930
|
运行后,图形(材料)将依据光线的照射进行反射。 反射要求由函数glColorMaterial进行设定。
|
|
GL_CULL_FACE
|
2884
|
依据函数glCullFace要求启用隐藏图形材料的面。
|
|
GL_DEPTH_TEST
|
2929
|
启用深度測试。
依据坐标的远近自己主动隐藏被遮住的图形(材料) |
|
GL_DITHER
|
3024
|
启用抖动
|
|
GL_FOG
|
2912
|
雾化效果 比如距离越远越模糊
|
|
GL_INDEX_LOGIC_OP
|
3057
|
逻辑操作
|
|
GL_LIGHT0 ~ GL_LIGHT7
|
16384 ~ 16391
|
启用0号灯到7号灯(光源) 光源要求由函数glLight函数来完毕
|
|
GL_LIGHTING
|
2896
|
启用灯源
|
|
GL_LINE_SMOOTH
|
2848
|
运行后。过虑线段的锯齿
|
|
GL_LINE_STIPPLE
|
2852
|
运行后,画虚线
|
|
GL_LOGIC_OP
|
3057
|
逻辑操作
|
|
GL_MAP1_COLOR_4
|
3472
|
依据函数Map1对贝赛尔曲线的设置。 启用glEvalCoord1,glEvalMesh1,glEvalPoint1 生成RGBA曲线
|
|
GL_MAP1_INDEX
|
3473
|
依据函数Map1对贝赛尔曲线的设置, 启用glEvalCoord1,glEvalMesh1,glEvalPoint1 生成颜色索引曲线
|
|
GL_MAP1_NORMAL
|
3474
|
依据函数Map1对贝赛尔曲线的设置, 启用glEvalCoord1,glEvalMesh1,glEvalPoint1 生成法线
|
|
GL_MAP1_TEXTURE_COORD_1
|
3475
|
依据函数Map1对贝赛尔曲线的设置。 启用glEvalCoord1,glEvalMesh1,glEvalPoint1 生成文理坐标
|
|
GL_MAP1_TEXTURE_COORD_2
|
3476
|
依据函数Map1对贝赛尔曲线的设置。 启用glEvalCoord1,glEvalMesh1,glEvalPoint1 生成文理坐标
|
|
GL_MAP1_TEXTURE_COORD_3
|
3477
|
依据函数Map1对贝赛尔曲线的设置, 启用glEvalCoord1,glEvalMesh1,glEvalPoint1 生成文理坐标
|
|
GL_MAP1_TEXTURE_COORD_4
|
3478
|
依据函数Map1对贝赛尔曲线的设置。 启用glEvalCoord1,glEvalMesh1,glEvalPoint1 生成文理坐标
|
|
GL_MAP1_VERTEX_3
|
3479
|
依据函数Map1对贝赛尔曲线的设置, 启用glEvalCoord1,glEvalMesh1,glEvalPoint1 在三维空间里生成曲线
|
|
GL_MAP1_VERTEX_4
|
3480
|
依据函数Map1对贝赛尔曲线的设置, 启用glEvalCoord1,glEvalMesh1,glEvalPoint1 在四维空间里生成法线
|
|
GL_MAP2_COLOR_4
|
3504
|
依据函数Map2对贝赛尔曲线的设置, 启用glEvalCoord2,glEvalMesh2,glEvalPoint2 生成RGBA曲线
|
|
GL_MAP2_INDEX
|
3505
|
依据函数Map2对贝赛尔曲线的设置, 启用glEvalCoord2,glEvalMesh2,glEvalPoint2 生成颜色索引
|
|
GL_MAP2_NORMAL
|
3506
|
依据函数Map2对贝赛尔曲线的设置, 启用glEvalCoord2,glEvalMesh2,glEvalPoint2 生成法线
|
|
GL_MAP2_TEXTURE_COORD_1
|
3507
|
依据函数Map2对贝赛尔曲线的设置, 启用glEvalCoord2,glEvalMesh2,glEvalPoint2 生成纹理坐标
|
|
GL_MAP2_TEXTURE_COORD_2
|
3508
|
依据函数Map2对贝赛尔曲线的设置, 启用glEvalCoord2,glEvalMesh2,glEvalPoint2 生成纹理坐标
|
|
GL_MAP2_TEXTURE_COORD_3
|
3509
|
依据函数Map2对贝赛尔曲线的设置, 启用glEvalCoord2,glEvalMesh2,glEvalPoint2 生成纹理坐标
|
|
GL_MAP2_TEXTURE_COORD_4
|
3510
|
依据函数Map2对贝赛尔曲线的设置, 启用glEvalCoord2,glEvalMesh2,glEvalPoint2 生成纹理坐标
|
|
GL_MAP2_VERTEX_3
|
3511
|
依据函数Map2对贝赛尔曲线的设置。 启用glEvalCoord2,glEvalMesh2,glEvalPoint2 在三维空间里生成曲线
|
|
GL_MAP2_VERTEX_4
|
3512
|
依据函数Map2对贝赛尔曲线的设置, 启用glEvalCoord2,glEvalMesh2,glEvalPoint2 在三维空间里生成曲线
|
|
GL_NORMALIZE
|
2977
|
依据函数glNormal的设置条件,启使用方法向量
|
|
GL_POINT_SMOOTH
|
2832
|
运行后。过虑线点的锯齿
|
|
GL_POLYGON_OFFSET_FILL
|
32823
|
依据函数glPolygonOffset的设置。启用面的深度偏移
|
|
GL_POLYGON_OFFSET_LINE
|
10754
|
依据函数glPolygonOffset的设置,启用线的深度偏移
|
|
GL_POLYGON_OFFSET_POINT
|
10753
|
依据函数glPolygonOffset的设置。启用点的深度偏移
|
|
GL_POLYGON_SMOOTH
|
2881
|
过虑图形(多边形)的锯齿
|
|
GL_POLYGON_STIPPLE
|
2882
|
运行后。多边形为矢量绘图
|
|
GL_SCISSOR_TEST
|
3089
|
依据函数glScissor设置。启用图形剪切
|
|
GL_STENCIL_TEST
|
2960
|
开启使用模板測试而且更新模版缓存。
參见glStencilFunc和glStencilOp. |
|
GL_TEXTURE_1D
|
3552
|
启用一维文理
|
|
GL_TEXTURE_2D
|
3553
|
启用二维文理
|
|
GL_TEXTURE_GEN_Q
|
3171
|
依据函数glTexGen,启用纹理处理
|
|
GL_TEXTURE_GEN_R
|
3170
|
依据函数glTexGen。启用纹理处理
|
|
GL_TEXTURE_GEN_S
|
3168
|
依据函数glTexGen,启用纹理处理
|
|
GL_TEXTURE_GEN_T
|
3169
|
依据函数glTexGen,启用纹理处理
|
这些东西会经经常使用到的。
。。。
。。。。
void glBlendFunc (GLenum sfactor, GLenum dfactor);//定义像素算法
三 关于多边形的正反面以及绘制方式
嗯 这个。 肿么说呢, 还是先看代码吧。。,直接讲会非常空洞滴。。。
void display()
{
glClear( GL_COLOR_BUFFER_BIT);
glPolygonMode( GL_FRONT, GL_FILL);
glPolygonMode( GL_BACK, GL_LINE);
glFrontFace( GL_CCW);
glBegin( GL_POLYGON);
glVertex2f( -0.5f, -0.5f);
glVertex2f( 0.0f, -0.5f);
glVertex2f( 0.0f, 0.0f);
glVertex2f( -0.5f, 0.0f);
glEnd();
glBegin( GL_POLYGON);
glVertex2f( 0.0f, 0.0f);
glVertex2f( 0.0f, 0.5f);
glVertex2f( 0.5f, 0.5f);
glVertex2f( 0.5f, 0.0f);
glEnd();
glFinish();
}
我们慢慢来看,
void glPolygonMode(GLenum face,GLenum mode);
作用是控制多边形的显示方式
參数一:确定显示模式将适用于物体的哪些部分,控制多边形的正面和背面的画图模式
一般我们都是顶点以逆时针顺序出如今屏幕上的面”为“正面”。还有一个面即成为“反面”
參数二:确定选中的物体的面以何种方式显示(显示模式)
參见上面的两个正方形
当然, 另一个GL_POINT仅仅显示定点(预计也没啥用。
。
。。
。
)
void glFrontFace(GLenum mode);
嗯, 这个函数的作用是设置正方形的正反面是怎样决定的,
默认的情况下是GL_CCW。 我们也来看看GL_CW的效果
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzY0MjQ5NA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
对吧, 反转了吧, 哦 对了这些函数也是要写在glBegin()前面哦。
。。。
四 剔除多边形的表面
非常多时候, 我们的东东会有前后遮挡的效果, 假设我们还是所有绘制了简直就是在浪费资源嘛,,,,所以我们把那些被遮挡的多边形能够剔除掉, 这样能够大大的提升我们程序的执行效率,,,
还记得我们刚刚说的glEnable()吗, 没错。 我们就要先使用他来开启剔除功能, 然后再使用glCullFace()来进行剔除(參数也是正面, 反面, 所有)。,,
剔除仅仅是影响多边形, 对点和直线没有影响
代码走起
glEnable(GL_CULL_FACE);
glCullFace( GL_FRONT_AND_BACK);
五 虚线以及多边形镂空
嗯 老规矩了glEnable()开启虚线。 glLineStipple()设置虚线的显示方式
void display( void)
{
glClear( GL_COLOR_BUFFER_BIT);
glEnable( GL_LINE_STIPPLE);
glLineStipple( 2.0f, 0x0F0F);
glLineWidth( 5.0f);
glBegin( GL_LINES);
glVertex2f( -0.5f, -0.5f);
glVertex2f( 0.5f, 0.5f);
glEnd();
glFinish();
}
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzY0MjQ5NA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
void glLineStipple (GLint factor, GLushort pattern);
OpenGL中设置直线的当前点画模式。
pattern參数是由1或0组成的16位序列,它们依据须要进行反复,对一条特定的直线进行点画处理。从这个模式的低位開始,一个像素一个像素的进行处理。假设模式中相应的位是1,就绘制这个像素,否则就不绘制。模式能够使用factor參数(表示反复因子)进行扩展。它与1和0的连续子序列相乘。因此。假设模式中出现了3个1。而且factor是2,那么它们就扩展为6个连续的1。
必须以GL_LINE_STIPPLE为參数调用glEnable()才干启用直线点画功能。为了禁用直线点画功能,能够向glDisable()函数传递同一个參数。
就拿我们刚刚写的0x0F0F(0000111100001111)来看, 假设第一个參数我们穿的是1, 那么就从低位往高位(从右往左)进行绘制, 1表示绘制, 0表示不绘制,绘制结果就是【先绘制四个。 再空四个。 再绘制四个, 再空四个】 假设我们穿的參数是2那么就是【先绘制八个, 再空八个, 再绘制八个, 再空八个】。以此类推。 看图
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzY0MjQ5NA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
再来说说多边形的镂空
也是使用glEnable()开启镂空。使用glPolygonStipple()设置镂空模式, 先看代码后解释
这个数组是套用红宝书上面的的, 假设要我自己写一个出来。 我预计我会疯掉的
GLubyte data[128] = {
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x03, 0x80, 0x01, 0xC0,
0x06, 0xC0, 0x03, 0x60,
0x04, 0x60, 0x06, 0x20,
0x04, 0x30, 0x0C, 0x20,
0x04, 0x18, 0x18, 0x20,
0x04, 0x0C, 0x30, 0x20,
0x04, 0x06, 0x60, 0x20,
0x44, 0x03, 0xC0, 0x22,
0x44, 0x01, 0x80, 0x22,
0x44, 0x01, 0x80, 0x22,
0x44, 0x01, 0x80, 0x22,
0x44, 0x01, 0x80, 0x22,
0x44, 0x01, 0x80, 0x22,
0x44, 0x01, 0x80, 0x22,
0x66, 0x01, 0x80, 0x66,
0x33, 0x01, 0x80, 0xCC,
0x19, 0x81, 0x81, 0x98,
0x0C, 0xC1, 0x83, 0x30,
0x07, 0xe1, 0x87, 0xe0,
0x03, 0x3f, 0xfc, 0xc0,
0x03, 0x31, 0x8c, 0xc0,
0x03, 0x33, 0xcc, 0xc0,
0x06, 0x64, 0x26, 0x60,
0x0c, 0xcc, 0x33, 0x30,
0x18, 0xcc, 0x33, 0x18,
0x10, 0xc4, 0x23, 0x08,
0x10, 0x63, 0xC6, 0x08,
0x10, 0x30, 0x0c, 0x08,
0x10, 0x18, 0x18, 0x08,
0x10, 0x00, 0x00, 0x08,
};
void display( void)
{
glClear( GL_COLOR_BUFFER_BIT);
glEnable( GL_POLYGON_STIPPLE);
glPolygonStipple( data);
glRectf( -0.5f, -0.5f, 0.0f, 0.0f);
glFinish();
}
哈哈, 有木有认为非常奇妙,,。我们居然画了一堆苍蝇在屏幕上, 事实上我们的那个数组就是一个苍蝇的图像。
我们来分析一下, 数组有128个字节, 表示了一个32x32的矩阵型镂空的数据。数组里面的第一个字节表示了左下方从左到右的8个像素是否镂空, 以此类摧。。。
用这个图能够表示出来
我们再来看看没有镂空的效果
就是这个吊样子。。
。。。
假设每次都让我们程序来做这种数组, 我预计程序猿真的会疯掉吧, 我们来看看简单的方法, 首先打开你的画板工具(就是电脑自带的那个 )随便画一幅画, 保存单色位图的bmp
好了, 我们如今来使用这张位图
void display( void)
{
GLubyte data[128];
FILE* fp;
fp = fopen( "openGLTest.bmp", "rb");
if ( !fp)
{
exit( 0);
}
if ( fseek( fp, -(int)sizeof( data), SEEK_END))
{
exit( 0);
}
if ( !fread( data, sizeof( data), 1, fp))
{
exit( 0);
}
fclose( fp); glClear( GL_COLOR_BUFFER_BIT);
glEnable( GL_POLYGON_STIPPLE);
glPolygonStipple( data);
glRectf( -0.5f, -0.5f, 0.0f, 0.0f);
glFinish();
}
是不是我们画的图片也载入出来了啊,,。,注意了。 图片的位置一定要和运行文件放在一块啊, 毕竟人家是好基友嘛, 今天我们就到这里了。。
。
每天积累一点点, 总有一天你会成为大神的
版权声明:本文博主原创文章,博客,未经同意不得转载。
openGL研究钞四 : 关于颜色, 尺寸, 虚线, 多边形逆转, 空洞, 使用位图的更多相关文章
- SCARA——OpenGL入门学习四(颜色)
OpenGL入门学习[四] 本次学习的是颜色的选择.终于要走出黑白的世界了~~ OpenGL支持两种颜色模式:一种是RGBA,一种是颜色索引模式. 无论哪种颜色模式,计算机都必须为每一个像素保存一些数 ...
- OpenGL入门程序四:颜色模式
1.OpenGL支持两种颜色模式: 1>RGBA颜色模式 ,用 glClearColor 指定清空屏幕后的颜色,即“空颜色” . 2>索引颜色模式,用 glClearIndex 指定清空屏 ...
- 【Android 应用开发】Android资源文件 - 使用资源存储字符串 颜色 尺寸 整型 布尔值 数组
. 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/19913755 . 一. Android资源文件简介 1 ...
- Android资源文件 - 使用资源存储字符串 颜色 尺寸 整型 布尔值 数组
一. Android资源文件简介 1. Android应用资源的作用 (1) Android项目中文件分类 在Android工程中, 文件主要分为下面几类 : 界面布局文件, Java src源文件, ...
- Opengl研究4.0 走样与反走样
Opengl研究4.0 走样与反走样 DionysosLai(906391500@qq.com) 2014-06-25 走样与反走样,也叫混淆与反混淆.所谓走样,是因为使用离散量(像 ...
- OpenGL研究3.0 多边形区域填充
OpenGL研究3.0 多边形区域填充 DionysosLai(906391500@qq.com)2014-06-22 所谓多边形区域填充.就是将多边形内部区域,所有已相同色块填充.注意:这里讨论的多 ...
- OpenGL研究2.0 计算圆
OpenGL研究2.0 计算圆 DionysosLai2014-06-18 在游戏中.常常有些地方涉及到一些圆的轨迹计算,例如一些转轴类的游戏,人物一般在角色转轴上面运动.这时,我们就要时刻计算角色的 ...
- NeHe OpenGL教程 第四十七课:CG顶点脚本
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- NeHe OpenGL教程 第四十三课:FreeType库
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
随机推荐
- 关于hibernate中多对多关系
关于多对多关系 数据库:在使用多对多的关系时,我们能够使用复合主键.也能够不使用,直接引入外键相同能够实现. 在数据库中使用多对多关系时,须要一个中间表. 多对多关系中的数据库结构例如以下: 表:Or ...
- Vim -> 边确认边查找替换
进行简单的全局查找替换的时候,能够使用ex的例如以下命令 :%s/which/what/g 它的使用方法比較简单 % 表示每一行(everyline) s 替换(substitue) which 查找 ...
- IE与FF脚本兼容性问题
(1) window.event: 表示当前的事件对象,IE有这个对象,FF没有,FF通过给事件处理函数传递事件对象 (2) 获取事件源 IE用srcElement获取事件源,而FF用target获取 ...
- 快速学会搭建SVN服务器
原文:快速学会搭建SVN服务器 SVN是一个版本控制工具,常用于我们软件开发项目中,用来管理我们团队共同使用的代码,文档等历史版本的管理,保持代码的更新,避免混乱. 需要工具: svn安装程序:免费下 ...
- 《算法导论》 — Chapter 7 高速排序
序 高速排序(QuickSort)也是一种排序算法,对包括n个数组的输入数组.最坏情况执行时间为O(n^2). 尽管这个最坏情况执行时间比較差.可是高速排序一般是用于排序的最佳有用选择.这是由于其平均 ...
- 每天一个JavaScript实例-递归实现反转数组字符串
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- Spring相框
1.什么是Spring相框?Spring有哪些主要模块框架? Spring框架是一个为Java应用程序的开发提供了综合.广泛的基础性支持的Java平台. Spring帮助开发人员攻克了开发中基础性的问 ...
- CentOS 7 命令备忘录
1 查看目录下有什么文件/目录 >ls //list 列出目录文件信息 >ls -l 或ll //以“详细信息”查看目录文件 >ls -a //-all 查看目录“全部”(包含隐藏文 ...
- coding.net解决github上下载速度慢问题
由 于众所周知的原因,从github下载项目很慢,一般不超过10kb(我的是20兆公司网)例如我下载OpenRefine,没有3个小时搞不定.所以想 到了一个方法来解决他.就是使用国内其他代码托管平台 ...
- Win7+ubuntu kylin+CentOS 6.5三系统安装图文教程
Win7+ubuntu kylin+CentOS 6.5三系统安装图文教程 引言:原本机子上已经装好了win7+Ubuntu Kylin 由win7引导,而不是Ubuntu的grub引导的双系统(安装 ...