天天看點

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;

最終效果如圖所示: