我们将从设置保存雾的信息的变量开始。变量fogMode用来保存三种类型的雾:GL_EXP,GL_EXP2GL_LINEAR。变量fogfilter将用来表示我们使用的是哪种雾类型。变量fogColor保存雾的颜色。还加了一个布尔类型的变量gPressed用来记录'g'键是否被按下。

None.gif    bool gPressed;
None.gif
None.gif    GLuint    fogMode[
3];    // Storage For Three Types Of Fog
None.gif
    GLuint    fogfilter;// Which Fog Mode To Use 
None.gif
    GLfloat    fogColor[4];// Fog Color

None.gifBOOL COpenGLDemoView::InitGL(GLvoid)                                        // All Setup For OpenGL Goes Here
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    
if (!LoadGLTextures())                                // Jump To Texture Loading Routine ( NEW )
ExpandedSubBlockStart.gifContractedSubBlock.gif
    dot.gif{
InBlock.gif        
return FALSE;                                    // If Texture Didn't Load Return FALSE
ExpandedSubBlockEnd.gif
    }

InBlock.gif    glEnable(GL_TEXTURE_2D);                            
// Enable Texture Mapping ( NEW )
InBlock.gif

InBlock.gif    glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient);                
// 设置环境光
InBlock.gif
    glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse);                // 设置漫射光
InBlock.gif
    glLightfv(GL_LIGHT1, GL_POSITION,LightPosition);            // 设置光源位置
InBlock.gif
    glEnable(GL_LIGHT1);                            // 启用一号光源
InBlock.gif

InBlock.gif    glShadeModel(GL_SMOOTH);                            
// Enable Smooth Shading
InBlock.gif
    COLORREF color = ::GetSysColor(COLOR_3DFACE);
InBlock.gif    
//glClearColor((float)GetRValue(color)/255.0f,
InBlock.gif    
//             (float)GetGValue(color)/255.0f,
InBlock.gif    
//             (float)GetBValue(color)/255.0f,
InBlock.gif    
//             1.0);
InBlock.gif
    glClearColor(0.5f,0.5f,0.5f,1.0f);
InBlock.gif
InBlock.gif    glClearDepth(
1.0f);                                    // Depth Buffer Setup
InBlock.gif
    glEnable(GL_DEPTH_TEST);                            // Enables Depth Testing
InBlock.gif
    glDepthFunc(GL_LEQUAL);                                // The Type Of Depth Testing To Do
InBlock.gif
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);    // Really Nice Perspective Calculations
InBlock.gif

InBlock.gif
InBlock.gif    glFogi(GL_FOG_MODE, fogMode[fogfilter]);            
// Fog Mode
InBlock.gif
    glFogfv(GL_FOG_COLOR, fogColor);                    // Set Fog Color
InBlock.gif
    glFogf(GL_FOG_DENSITY, 0.35f);                        // How Dense Will The Fog Be
InBlock.gif
    glHint(GL_FOG_HINT, GL_DONT_CARE);                    // Fog Hint Value
InBlock.gif
    glFogf(GL_FOG_START, 1.0f);                            // Fog Start Depth
InBlock.gif
    glFogf(GL_FOG_END, 5.0f);                            // Fog End Depth
InBlock.gif
    glEnable(GL_FOG);                                    // Enables GL_FOG
InBlock.gif
    return TRUE;                                        // Initialization Went OK
ExpandedBlockEnd.gif
}

None.gif
None.gif
None.gif
void COpenGLDemoView::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) 
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    
// TODO: Add your message handler code here and/or call default
InBlock.gif
    switch(nChar)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif    
case 'G':
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
if(gPressed==TRUE)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif        
InBlock.gif                fogfilter
=(fogfilter+1)%3;
InBlock.gif                gPressed 
= FALSE;
InBlock.gif                glFogi (GL_FOG_MODE, fogMode[fogfilter]);    
// Fog Mode
ExpandedSubBlockEnd.gif
            }

InBlock.gif            
break;
ExpandedSubBlockEnd.gif        }

InBlock.gif    
default:
InBlock.gif        
break;
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    CView::OnKeyUp(nChar, nRepCnt, nFlags);
ExpandedBlockEnd.gif}

None.gif
None.gif
None.gif
void COpenGLDemoView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    
// TODO: Add your message handler code here and/or call default
InBlock.gif
    switch(nChar)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif    
case 'G':
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            gPressed 
= TRUE;
InBlock.gif            
break;
ExpandedSubBlockEnd.gif        }

InBlock.gif    
InBlock.gif    
default:
InBlock.gif        
break;
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    CView::OnKeyDown(nChar, nRepCnt, nFlags);
ExpandedBlockEnd.gif}

None.gif
None.gifCOpenGLDemoView::COpenGLDemoView()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    
this->gPressed = FALSE;
InBlock.gif
InBlock.gif    
this->fogMode[0= GL_EXP;
InBlock.gif    
this->fogMode[1= GL_EXP2;
InBlock.gif    
this->fogMode[2= GL_LINEAR;
InBlock.gif
InBlock.gif    
this->fogfilter = 0;
InBlock.gif
InBlock.gif    
this->fogColor[0= 0.5f;
InBlock.gif    
this->fogColor[1= 0.5f;
InBlock.gif    
this->fogColor[2= 0.5f;
InBlock.gif    
this->fogColor[3= 1.0f;
ExpandedBlockEnd.gif}

None.gif

第一行glEnable(GL_FOG);是初始化雾效。

第二行glFogi(GL_FOG_MODE, fogMode[fogfilter]);建立雾的过滤模式。之前我们声明了数组fogMode,它保存了值GL_EXP, GL_EXP2, and GL_LINEAR。(是计算雾效混合因子的三种方式):

GL_EXP - 充满整个屏幕的基本渲染的雾。它能在较老的PC上工作,因此并不是特别像雾。

GL_EXP2 - GL_EXP更进一步。它也是充满整个屏幕,但它使屏幕看起来更有深度。

GL_LINEAR - 最好的渲染模式。物体淡入淡出的效果更自然。

 

第三行glFogfv(GL_FOG_COLOR, fogcolor);设置雾的颜色。之前我们已将变量fogcolor设为(0.5f,0.5f,0.5f,1.0f),这是一个很棒的灰色。

 

接下来我们看看最后的四行。glFogf(GL_FOG_DENSITY, 0.35f);这行设置雾的密度。增加数字会让雾更密,减少它则雾更稀。

 

glHint (GL_FOG_HINT, GL_DONT_CARE); 设置修正。我使用了GL_DONT_CARE因为我不关心它的值。

 

gl_dont_care - OpenGL决定使用何种雾效(对每个顶点还是每个像素执行雾效计算)和一个未知的公式

gl_nicest - 对每个像素执行雾效计算(效果好)

gl_fastest - 对每个顶点执行雾效计算 (更快,但效果不如上面的好)

 

下一行glFogf(GL_FOG_START, 1.0f);设定雾效距屏幕多近开始。你可以根据你的需要随意改变这个值。下一行类似,glFogf(GL_FOG_END, 5.0f);告诉OpenGL程序雾效持续到距屏幕多远。

200782703.jpg

200782704.jpg