这篇是在上一篇的基础上修改而来的,对应着Nehe教程的第8课,代码仍然采用MFC框架来实现。
其中 InitGL 需要做些修改,加入混合操作所需要的代码:
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
BOOLCOpenGLDemoView::InitGL(GLvoid)
{
if ( ! LoadGLTextures()) // JumpToTextureLoadingRoutine(NEW)
{
return FALSE; // IfTextureDidn'tLoadReturnFALSE
}
glEnable(GL_TEXTURE_2D); // EnableTextureMapping(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); // EnableSmoothShading
// COLORREFcolor=::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 ); // BlackBackground
glClearDepth( 1.0f ); // DepthBufferSetup
glEnable(GL_DEPTH_TEST); // EnablesDepthTesting
glDepthFunc(GL_LEQUAL); // TheTypeOfDepthTestingToDo
glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST); // ReallyNicePerspectiveCalculations
glColor4f( 1.0f , 1.0f , 1.0f , 0.5 ); // FullBrightness.50%Alpha
glBlendFunc(GL_SRC_ALPHA,GL_ONE); // SetTheBlendingFunctionForTranslucency
return TRUE; // InitializationWentOK
}
{
if ( ! LoadGLTextures()) // JumpToTextureLoadingRoutine(NEW)
{
return FALSE; // IfTextureDidn'tLoadReturnFALSE
}
glEnable(GL_TEXTURE_2D); // EnableTextureMapping(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); // EnableSmoothShading
// COLORREFcolor=::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 ); // BlackBackground
glClearDepth( 1.0f ); // DepthBufferSetup
glEnable(GL_DEPTH_TEST); // EnablesDepthTesting
glDepthFunc(GL_LEQUAL); // TheTypeOfDepthTestingToDo
glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST); // ReallyNicePerspectiveCalculations
glColor4f( 1.0f , 1.0f , 1.0f , 0.5 ); // FullBrightness.50%Alpha
glBlendFunc(GL_SRC_ALPHA,GL_ONE); // SetTheBlendingFunctionForTranslucency
return TRUE; // InitializationWentOK
}
最后在void COpenGLDemoView::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)中加入对B按键的事件处理代码:
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
case ' B ' :
{
if (bPressed == TRUE)
{ // 防止长时间按着'B'键而导致持续混合变化
bLighting = ! bLighting;
if (bLighting)
{
glEnable(GL_BLEND); // TurnBlendingOn
glDisable(GL_DEPTH_TEST); // TurnDepthTestingOff
}
else
{
glDisable(GL_BLEND); // TurnBlendingOff
glEnable(GL_DEPTH_TEST); // TurnDepthTestingOn
}
}
bPressed = FALSE;
break ;
}
case ' B ' :
{
if (bPressed == TRUE)
{ // 防止长时间按着'B'键而导致持续混合变化
bLighting = ! bLighting;
if (bLighting)
{
glEnable(GL_BLEND); // TurnBlendingOn
glDisable(GL_DEPTH_TEST); // TurnDepthTestingOff
}
else
{
glDisable(GL_BLEND); // TurnBlendingOff
glEnable(GL_DEPTH_TEST); // TurnDepthTestingOn
}
}
bPressed = FALSE;
break ;
}
最终效果如图所示: