现在的位置: 首页 > 综合 > 正文

学习OpenGL(八)混色和雾化

2017年10月04日 ⁄ 综合 ⁄ 共 2116字 ⁄ 字号 评论关闭

         

学习OpenGL(八)混色和雾化

kezunhai@gmail.com

http://blog.csdn.net/kezunhai

           在本文将介绍OPenGL提供的混色和雾化函数,使用者两类函数可以增强图形的真实感。混色函数支持模拟窗户、玻璃杯和其他透明对象的效果;雾化函数为你绘制的多边形添加一些颜色,使场景具有薄雾的效果,或者只是凄凉的效果。

         1)混色(glBlendFunc)

          在OPenGL中,混色提供了对颜色缓冲区中RGBA颜色存储的像素级控制,混色操作不能用在颜色索引模式中,在颜色索引窗口中也被禁用。为了在RGBA窗口中能够混色,一定要首先调用函数glEnable(GL_BLEND),然后用两个参数调用glBlendFunc函数:源颜色和目标颜色的混色函数,默认情况下,这些参数是GL_ONE和GL_ZERO,分别等效于glDisable和GL_BLEND。源混色函数和目标色的混色函数如表:



           (1)使用混色制作透明效果

               透明效果可能是混色方法应用最典型的情况,通常用于窗户、瓶子和水等一些透明的3D对象。用法如下:

	glEnable( GL_BLEND);
	glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

            (2)混色消除锯齿

               可以使用相同的混色函数来更好地消除点、线和多边形锯齿。在硬件辅助消除锯齿和混色的系统中,混色会产生类似使用累积缓冲区所做的全屏锯齿场景,同时多次混色比累积要快得多,因为需要画一次场景。要使用混色方法消除锯齿,需要调用如下方法:

glEnable(GL_BLEND);
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_LINE_SMOOTH);
glEnable( GL_POINT_SMOOTH);
glEnable( GL_POLYGON_SMOOTH);

          但要注意,如果有24位或更高的颜色精度,这类混合效果会更好。

         (3)在画图程序中使用混色

            用于3D图形的技术同样可以应用于2D图形,在画图程序中,可以用混色方法来产生软边的“刷子”。开始定义每个刷子的亮度alpha图像,亮度alpha图像包含亮度(灰度)和alpha值,调用如下函数:

glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glPixelTransferi( GL_RED_SCALE, red);
glPixelTransferi(GL_GREEN_SCALE, green);
glPixelTransferi(GL_BLUE_SCALE, blue);

          2)雾化(glFog)
           通过glFog函数,OpenGL提供了深度感(根据距离产生明暗变化)及大气效果。实际上,雾化可以在与用户距离的基础上,提供天际(混合)预定义颜色的方法。OpenGL提供三种雾化效果:GL_LINEAR产生深度感,GL_EXP为大雾或云的效果,GL_EXP2为烟和薄雾效果。可以使用glFog函数选择雾化模式,如:

glFogi( GL_FOG_MODE, GL_LINEAR);
glFogi( GL_FOG_MODE, GL_EXP);
glFogi( GL_FOG_MODE, GL_EXP2);

选定雾化类型后,还必须选择雾化的颜色,可以通过用glFogfv和glFogiv函数与场景混合,如:

	GLfloat fog_color[4]={ r, g, b, a};
	glFogfv( GL_FOG_COLOR, fog_color);

         (1)具有深度的雾

          可以使用GL_FOG_START和GL_FOG_END来实现具有深度感的效果,如下面代码将雾的颜色设置为黑色,雾的模式为GL_LINEAR:

	static float fog_color[4] ={ 0.0, 0.0, 0.0, 0.0};
	glEnable(GL_FOG);
	glFogf( GL_FOG_MODE, GL_LINEAR);
	glFogf( GL_FOG_COLOR, fog_color);
	glFogf( GL_FOG_START, 10.0);
	glFogf( GL_FOG_END, 20.0);

其中,GL_FOG_START和GL_FOG_END参数指定雾的坐标中开始和结束的距离,如果没有雾化效果,则物体比GL_FOG_START的距离更近,远于GL_FOG_END距离的物体使用最大的雾化效果进行渲染。
          (2)其他雾化类型

           对于其他雾化类型,可能要Giel雾的颜色设成白色或其他明亮颜色,除了雾的颜色外,GL_EXP和GL_EXP2雾化类型还有其他密度参数:

glFogf( GL_FOG_DENSITY, density);

         density参数可以为比0.0大的数,但通常小于0.1。    

作者:kezunhai出处:http://blog.csdn.net/kezunhai欢迎转载或分享,但请务必声明文章出处。

抱歉!评论已关闭.