雾化特效
雾化是一种模拟自然界中雾气对场景物体视觉效果产生影响的图形绘制技术。此技术从视点到物体逐渐将物体的绘制颜色淡化,直至背景色。通过雾化处理可较好的表现出物体到视点的距离感。虽然雾化的具体计算非常复杂,但在OpenGL中的使用却非常简单。首先调用glEnable(GL_FOG)以启用雾化处理,启用后离视点较远的物体开始淡化成雾的颜色。然后可通过glFog*()函数来选择控制雾的浓度和颜色的方程,具体形式为:
| void glFog{if}[v](GLenum pname,TYPE param); | 该函数设置了雾化参数和函数,在pname为GL_FOG MODE时,参数param可以为GL_EXP(指数)、GL_EXP2(指数平方)和GL_LINEAR(线性);如果参数pname为GL_FOG_DENSITY、GL_FOG_START或GL_FOG_END,参数param将分别指定在不同雾化数学模型下的不同计算公式参量;在参数pname为GL_FOG_COLOR时,param将为一个指向颜色向量的指针。最后,如果有必要,还可以调用函数glHint(GL_FOG_HINT)进一步指定雾化效果。下面给出实现雾化效果的部分具体示例代码及其绘制结果(图2):
 图2 雾化效果 |
void CALLBACK Display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清屏 glPushMatrix(); // 绘制近视点景物 glTranslatef(-3.0, -1.5, -2.0); auxSolidTorus(0.6, 1.5); glPopMatrix(); glPushMatrix(); // 绘制远视点景物 glTranslatef(2.0, 0.8, -10.0); auxSolidTorus(0.6, 1.5); glPopMatrix(); glFlush(); // 强制绘图完成 } void Init() { GLfloat mat_ambient[] = {0.7, 0.6, 0.0, 1.0}; // 设置光照模型 GLfloat mat_diffuse[] = {0.7, 0.6, 0.0, 1.0}; GLfloat mat_specular[] = {1.0, 0.0, 1.0, 1.0}; GLfloat mat_shininess[] = {50.0}; GLfloat position[] = {5.0, 5.0, 5.0, 1.0}; glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient); glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LESS); glLightfv(GL_LIGHT0, GL_POSITION, position); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glFrontFace(GL_CW); glEnable(GL_FOG); // 启用雾化处理 { glFogi(GL_FOG_MODE, GL_LINEAR); // 采用线性变化的雾化效果 GLfloat fogColor[] = {0.3, 0.3, 0.3, 1.0}; // 指定雾化颜色 glFogfv(GL_FOG_COLOR, fogColor); glFogf(GL_FOG_START, 3.0); // 指定按线性变化时计算公式的参量 glFogf(GL_FOG_END, 15.0); glHint(GL_FOG_HINT, GL_DONT_CARE); //规定雾化效果的质量 } } |
|