OpenGL入门笔记(十四)

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

     bool  gPressed;

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

BOOL COpenGLDemoView::InitGL(GLvoid)                                         //  All Setup For OpenGL Goes Here
{
    
if (!LoadGLTextures())                                // Jump To Texture Loading Routine ( NEW )
    {
        
return FALSE;                                    // If Texture Didn't Load Return FALSE
    }

    glEnable(GL_TEXTURE_2D);                            
// Enable Texture Mapping ( NEW )

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

    glShadeModel(GL_SMOOTH);                            
// Enable Smooth Shading
    COLORREF color = ::GetSysColor(COLOR_3DFACE);
    
//glClearColor((float)GetRValue(color)/255.0f,
    
//             (float)GetGValue(color)/255.0f,
    
//             (float)GetBValue(color)/255.0f,
    
//             1.0);
    glClearColor(0.5f,0.5f,0.5f,1.0f);

    glClearDepth(
1.0f);                                    // Depth Buffer Setup
    glEnable(GL_DEPTH_TEST);                            // Enables Depth Testing
    glDepthFunc(GL_LEQUAL);                                // The Type Of Depth Testing To Do
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);    // Really Nice Perspective Calculations


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



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

            
break;
        }

    
default:
        
break;
    }


    CView::OnKeyUp(nChar, nRepCnt, nFlags);
}



void  COpenGLDemoView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
    
// TODO: Add your message handler code here and/or call default
    switch(nChar)
    
{
    
case 'G':
        
{
            gPressed 
= TRUE;
            
break;
        }

    
    
default:
        
break;
    }


    CView::OnKeyDown(nChar, nRepCnt, nFlags);
}


COpenGLDemoView::COpenGLDemoView()
{
    
this->gPressed = FALSE;

    
this->fogMode[0= GL_EXP;
    
this->fogMode[1= GL_EXP2;
    
this->fogMode[2= GL_LINEAR;

    
this->fogfilter = 0;

    
this->fogColor[0= 0.5f;
    
this->fogColor[1= 0.5f;
    
this->fogColor[2= 0.5f;
    
this->fogColor[3= 1.0f;
}

第一行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

你可能感兴趣的:(OpenGL)