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)
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距离的物体使用最大的雾化效果进行渲染。
对于其他雾化类型,可能要Giel雾的颜色设成白色或其他明亮颜色,除了雾的颜色外,GL_EXP和GL_EXP2雾化类型还有其他密度参数:
glFogf( GL_FOG_DENSITY, density);
density参数可以为比0.0大的数,但通常小于0.1。
作者:kezunhai出处:http://blog.csdn.net/kezunhai欢迎转载或分享,但请务必声明文章出处。