OpenGL中的混合(Blending)

简介:
这篇是在上一篇的基础上修改而来的,对应着Nehe教程的第8课,代码仍然采用MFC框架来实现。其中InitGL需要做些修改,加入混合操作所需要的代码:

BOOLCOpenGLDemoView::InitGL(GLvoid)                                       
 {
    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.0f, 0.0f, 0.0f, 0.5f);                // Black Background


    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

    glColor4f(1.0f, 1.0f, 1.0f, 0.5);                    // Full Brightness.  50% Alpha
    glBlendFunc(GL_SRC_ALPHA,GL_ONE);                    // Set The Blending Function For Translucency


    return TRUE;                                        // Initialization Went OK
}
最后在void COpenGLDemoView::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)中加入对B按键的事件处理代码:


    case 'B':
    {
            if(bPressed==TRUE)
            {//防止长时间按着'B'键而导致持续混合变化
                bLighting = !bLighting;
                if(bLighting)
                {
                    glEnable(GL_BLEND);            // Turn Blending On
                    glDisable(GL_DEPTH_TEST);    // Turn Depth Testing Off
                }
                else
                {
                    glDisable(GL_BLEND);        // Turn Blending Off
                    glEnable(GL_DEPTH_TEST);    // Turn Depth Testing On
                }
            }
            bPressed = FALSE;

        break;
    }
最终效果如图所示:

200780904.jpg


本文转自Phinecos(洞庭散人)博客园博客,原文链接http://www.cnblogs.com/phinecos/archive/2007/08/09/849930.html,如需转载请自行联系原作者
目录
相关文章
|
存储 数据安全/隐私保护 C++
Qt 中文文档 Qt5.15 PDF Class (从官网Qt 5.15 翻译)
Qt 中文文档 Qt5.15 PDF Class (从官网Qt 5.15 翻译)
1218 0
|
存储 编译器 数据库
【C++ 包装器类 std::tuple】全面入门指南:深入理解并掌握C++ 元组 std::tuple 的实用技巧与应用(一)
【C++ 包装器类 std::tuple】全面入门指南:深入理解并掌握C++ 元组 std::tuple 的实用技巧与应用
849 0
|
缓存 Shell iOS开发
macos的AppCode破解安装激活2022-09-07最新教程(附破解工具及激活码)
本文讲的是AppCode破解、AppCode激活码、AppCode安装、AppCode永久激活码的最新永久激活教程。
1470 0
macos的AppCode破解安装激活2022-09-07最新教程(附破解工具及激活码)
|
图形学 C++
Qt实现Qchart的打印和打印预览的几种方法
Qt实现Qchart的打印和打印预览的几种方法
|
存储 编解码 算法
计算机图形学——实验四 纹理映射实验
实验四 纹理映射实验 掌握纹理映射的基本原理,利用VC++ OpenGL实现纹理映射技术。 在OpenGL中纹理映射所使用的纹理数据,既可以是程序生成的一组数据,也可以从外部文件中直接读取。 1. 利用直接创建纹理的方法生成二维纹理并映射到四边形上。 2. 从外部文件中直接读取纹理实现正方体每个面的纹理映射,并使正方体转动。整个过程需要三个步骤:创建纹理对象并绑定纹理、启用纹理映射和使用纹理坐标和几何坐标绘制,下面我们主要对创建纹理和绑定纹理这一过程进行阐述,并给出参考代码。 1)创建纹理对象并绑定纹理
873 0
计算机图形学——实验四 纹理映射实验
|
数据采集 运维 监控
游戏日志分析2:全方位数据采集
在上一篇文章中,我们介绍了日志数据对游戏的重要性,这一篇我们来讨论下如何高效地实施全方位无死角的日志采集。
6576 0
|
存储 机器学习/深度学习 弹性计算
云服务器ECS选购指南及省钱法宝(强烈建议收藏)
云服务器ECS怎么选,怎样更省钱?这一篇就够了
云服务器ECS选购指南及省钱法宝(强烈建议收藏)
PyQt5 技术篇-QWidget、QDialog程序窗口关闭closeEvent()触发事件方法重写
PyQt5 技术篇-QWidget、QDialog程序窗口关闭closeEvent()触发事件方法重写
1611 0
PyQt5 技术篇-QWidget、QDialog程序窗口关闭closeEvent()触发事件方法重写
DeepMind 在多智能体强化学习方面又有了新进展,最新成果登上 Science 杂志!
智能体与 AI 或人类队友协作打游戏,表现媲美人类玩家。
1955 0