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

posted on   Phinecos(洞庭散人)  阅读(1005)  评论(1编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
历史上的今天:
2006-08-27 操作系统复习笔记(三)

导航

统计

点击右上角即可分享
微信分享提示