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" >

二    设置颜色

预计小伙伴们都猜到了吧

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

开启使用模板測试而且更新模版缓存。

參见glStencilFuncglStencilOp.


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_FRONT表示显示模式将适用于物体的前向面(也就是物体能看到的面)

GL_BACK表示显示模式将适用于物体的后向面(也就是物体上不能看到的面)

GL_FRONT_AND_BACK表示显示模式将适用于物体的全部面

一般我们都是顶点以逆时针顺序出如今屏幕上的面”为“正面”。还有一个面即成为“反面”

參数二:确定选中的物体的面以何种方式显示(显示模式)

GL_LINE表示显示线段,多边形用轮廓显示

GL_FILL表示显示面,多边形採用填充形式

參见上面的两个正方形

当然, 另一个GL_POINT仅仅显示定点(预计也没啥用。

。。

void glFrontFace(GLenum mode);

嗯, 这个函数的作用是设置正方形的正反面是怎样决定的,

GL_CCW 表示窗体坐标上投影多边形的顶点顺序为逆时针方向的表面为正面。

GL_CW 表示顶点顺序为顺时针方向的表面为正面。

默认的情况下是GL_CCW。 我们也来看看GL_CW的效果

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzY0MjQ5NA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" >

对吧, 反转了吧, 哦 对了这些函数也是要写在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" >

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" >

再来说说多边形的镂空

也是使用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();
}

是不是我们画的图片也载入出来了啊,,。,注意了。 图片的位置一定要和运行文件放在一块啊, 毕竟人家是好基友嘛, 今天我们就到这里了。。

每天积累一点点, 总有一天你会成为大神的

版权声明:本文博主原创文章,博客,未经同意不得转载。

时间: 2024-10-13 13:54:27

openGL研究钞四 : 关于颜色, 尺寸, 虚线, 多边形逆转, 空洞, 使用位图的相关文章

阴影映射(Shadow Map)的研究(四)

阴影映射(Shadow Map)的研究(四) 上一篇文章粗略地介绍了要实现OpenGL ES 2.0的阴影映射所需的知识难点,现在简略地说明一下:1.FBO:2.着色器:3.float的分拆以及组合.上篇文章虽然说已经成功地移植了来自Java编写的Android下阴影映射的效果,但这边采用的很大程度上是OpenGL原生代码编写的内容,接下来的目标是采用自Qt 5起就逐渐采用的Qt对OpenGL的封装类,用面向对象的思维来处理OpenGL对象,这样让代码更加优雅. 1.FBO 首先说一下FBO.在

Opengl研究4.0 走样与反走样

DionysosLai([email protected]) 2014-06-25 走样与反走样,也叫混淆与反混淆.所谓走样,是由于使用离散量(像素)表示连续量(图形)而引起的失真. 走样现象: 1.      阶梯状的图形边界 如图所示: 由于像素点是一块一块的,存在锯齿状. 2.       图形细节失真 由于显示图形的最小单位为像素,像素是由宽度的.有时候,我们可能显示的线段比像素要窄,要小.那么可能出现两种情况:a. 如果显示的线段宽度比像素宽度小一点,将被保留:b. 如果线段很细,就不

live555源码研究(四)------UserAuthenticationDatabase类

一.UserAuthenticationDatabase类作用 1,用户/密码管理 2,鉴权管理 二.类UserAuthenticationDatabase继承关系图                         live555源码研究(四)------UserAuthenticationDatabase类,布布扣,bubuko.com

iOS多线程的初步研究(四)-- NSTimer

 iOS多线程的初步研究(四)-- NSTimer 原文地址  http://www.cnblogs.com/sunfrog/p/3243230.html 理解run loop后,才能彻底理解NSTimer的实现原理,也就是说NSTimer实际上依赖run loop实现的. 先看看NSTimer的两个常用方法: + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelec

OpenGL研究2.0 圆计算方法

DionysosLai2014-06-18 在游戏中,经常有些地方涉及到一些圆的轨迹计算,比方一些转轴类的游戏,人物一般在角色转轴上面运动.这时,我们就要时刻计算角色的位置.分析一下,圆位置的一般算法. 首先,如下图的一个圆: 图1 根据对称性原理,我们只需要计算黑色区域的点集合即可.同时,由于黑色区域的圆的切线斜率明显在-1到0,这点就可以和前面一节线段的计算方法相结合了. 圆的点计算方法: 1.      直接计算方法 1). 离散点计算法 利用隐函数公式方法:: 2). 三角函数方法 这两

openGL学习笔记四 : 关于颜色, 大小, 虚线, 多边形反转, 镂空, 使用位图

转载请保留出处,,,,hushuai1992http://blog.csdn.net/u013642494/article/category/2675731 额, 这个标题我都不知道该怎么起了, 如果没有标题, 请不要在意这些细节..... 我们看看上次我们画的点.以及线, 我们似乎忘了说如何设置点的大小( 哦, 不对, 我似乎是说了后面来说的....), 现在我们来看看 一    设置点的大小和线的粗细 void glPointSize (GLfloat size);//设置点的大小, 默认为

第四章 颜色补充(硬件知识)

在颜色上,我一直存在着一些疑问,为什么显示器可以显示不同的颜色呢?越先进的浏览器显示颜色的机制更加复杂, 所以我在维基上搜索了一些关于最早的阴极射线管等知识,摘抄在下面.便于学习.这里对维基百科表示感谢. 荧幕尺寸依荧幕对角线计算,通常以英寸(inch)作为单位,现时一般主流尺寸有17".19".21".22".24.27"等,指荧幕对角的长度.常用的显示屏又有标屏(窄屏)与宽屏,方荧幕长宽比为4:3(还有少量比例为5:4),宽荧幕长宽比为16:10或16

NeHe OpenGL教程 第四十七课:CG顶点脚本

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第四十七课:CG顶点脚本 CG 顶点脚本 nVidio的面向GPU的C语言,如果你相信它就好好学学吧,同样这里也只是个入门.记住,类似的语言还有微软的HLSL,OpenGL的GLSL,ATI的shaderMonker.不要选错哦:)

NeHe OpenGL教程 第四十三课:FreeType库

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第四十三课:FreeType库 在OpenGL中使用FreeType库 使用FreeType库可以创建非常好看的反走样的字体,记住暴雪公司就是使用这个库的,就是那个做魔兽世界的.尝试一下吧,我只告诉你了基本的使用方式,你可以走的更远