OpenGL入门笔记(十四)

简介:
我们将从设置保存雾的信息的变量开始。变量fogMode用来保存三种类型的雾:GL_EXP,GL_EXP2和GL_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


本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2007/08/27/871883.html,如需转载请自行联系原作者
目录
相关文章
|
vr&ar Android开发 C++
Android OpenGL入门
Android OpenGL入门
Android OpenGL入门
|
存储 缓存 安全
OpenGL ES 入门:GLKit加载图片
OpenGL ES 入门:GLKit加载图片
185 0
OpenGL ES 入门:GLKit加载图片
|
存储 缓存
案例 02、OpenGL入门--正方形键位控制
OpenGL入门--正方形键位控制
147 0
案例 02、OpenGL入门--正方形键位控制
|
缓存 容器
案例 01、OpenGL入门--绘制三角形
OpenGL中三角形的绘制,就类似于学习编程时的Hello world,是一个入门级的使用,重点在于理解图形是如何绘制的
271 0
案例 01、OpenGL入门--绘制三角形
|
C++ 异构计算 Python
OpenGL渲染入门
## 前言 在开始之前,先来看一段图像解码序列(格式为YUV420)的4个渲染结果,这里我分别截了4张图 ![image.png](https://ata2-img.cn-hangzhou.oss-pub.aliyun-inc.com/dca46d1be7dfee07981a7dea14ae3aa1.png) 其中4个渲染效果分别是 左上:直接渲染视频帧并绘制到窗口上 右上:
1809 0
|
API
OpenGL ES 入门API大全
本文章正确使用姿势:command/Ctrl + f  进行搜索对应的功能代码,找到它的详细解释。 (以下内容如有偏差,欢迎进行指正) 一.CAEAGLLayer 的使用: CAEAGLLayer 官方解释如图CAEAGLLayer,我来简单翻译一下: CAEAGLLayer 是继承于CALayer 的,可以用它在iOS 和tvOS 的设备上使用。
1498 0
下一篇
无影云桌面