OpenGL入门笔记(十四)
2007-08-27 19:55
387 查看
我们将从设置保存雾的信息的变量开始。变量fogMode用来保存三种类型的雾:GL_EXP,GL_EXP2和GL_LINEAR。变量fogfilter将用来表示我们使用的是哪种雾类型。变量fogColor保存雾的颜色。还加了一个布尔类型的变量gPressed用来记录'g'键是否被按下。
![](http://blog.csdn.net/Images/OutliningIndicators/None.gif)
bool gPressed;
![](http://blog.csdn.net/Images/OutliningIndicators/None.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/None.gif)
GLuint fogMode[3]; // Storage For Three Types Of Fog
![](http://blog.csdn.net/Images/OutliningIndicators/None.gif)
GLuint fogfilter;// Which Fog Mode To Use
![](http://blog.csdn.net/Images/OutliningIndicators/None.gif)
GLfloat fogColor[4];// Fog Color
![](http://blog.csdn.net/Images/OutliningIndicators/None.gif)
BOOL COpenGLDemoView::InitGL(GLvoid) // All Setup For OpenGL Goes Here
![](http://blog.csdn.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/ContractedBlock.gif)
![](http://blog.csdn.net/Images/dot.gif)
{
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
if (!LoadGLTextures()) // Jump To Texture Loading Routine ( NEW )
![](http://blog.csdn.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://blog.csdn.net/Images/dot.gif)
{
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
return FALSE; // If Texture Didn't Load Return FALSE
![](http://blog.csdn.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
glEnable(GL_TEXTURE_2D); // Enable Texture Mapping ( NEW )
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient); // 设置环境光
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse); // 设置漫射光
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
glLightfv(GL_LIGHT1, GL_POSITION,LightPosition); // 设置光源位置
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
glEnable(GL_LIGHT1); // 启用一号光源
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
glShadeModel(GL_SMOOTH); // Enable Smooth Shading
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
COLORREF color = ::GetSysColor(COLOR_3DFACE);
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
//glClearColor((float)GetRValue(color)/255.0f,
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
// (float)GetGValue(color)/255.0f,
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
// (float)GetBValue(color)/255.0f,
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
// 1.0);
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
glClearColor(0.5f,0.5f,0.5f,1.0f);
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
glClearDepth(1.0f); // Depth Buffer Setup
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
glEnable(GL_DEPTH_TEST); // Enables Depth Testing
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
glFogi(GL_FOG_MODE, fogMode[fogfilter]); // Fog Mode
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
glFogfv(GL_FOG_COLOR, fogColor); // Set Fog Color
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
glFogf(GL_FOG_DENSITY, 0.35f); // How Dense Will The Fog Be
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
glHint(GL_FOG_HINT, GL_DONT_CARE); // Fog Hint Value
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
glFogf(GL_FOG_START, 1.0f); // Fog Start Depth
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
glFogf(GL_FOG_END, 5.0f); // Fog End Depth
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
glEnable(GL_FOG); // Enables GL_FOG
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
return TRUE; // Initialization Went OK
![](http://blog.csdn.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://blog.csdn.net/Images/OutliningIndicators/None.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/None.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/None.gif)
void COpenGLDemoView::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
![](http://blog.csdn.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/ContractedBlock.gif)
![](http://blog.csdn.net/Images/dot.gif)
{
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
// TODO: Add your message handler code here and/or call default
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
switch(nChar)
![](http://blog.csdn.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://blog.csdn.net/Images/dot.gif)
{
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
case 'G':
![](http://blog.csdn.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://blog.csdn.net/Images/dot.gif)
{
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
if(gPressed==TRUE)
![](http://blog.csdn.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://blog.csdn.net/Images/dot.gif)
{
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
fogfilter=(fogfilter+1)%3;
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
gPressed = FALSE;
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
glFogi (GL_FOG_MODE, fogMode[fogfilter]); // Fog Mode
![](http://blog.csdn.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
break;
![](http://blog.csdn.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
default:
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
break;
![](http://blog.csdn.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
CView::OnKeyUp(nChar, nRepCnt, nFlags);
![](http://blog.csdn.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://blog.csdn.net/Images/OutliningIndicators/None.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/None.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/None.gif)
void COpenGLDemoView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
![](http://blog.csdn.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/ContractedBlock.gif)
![](http://blog.csdn.net/Images/dot.gif)
{
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
// TODO: Add your message handler code here and/or call default
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
switch(nChar)
![](http://blog.csdn.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://blog.csdn.net/Images/dot.gif)
{
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
case 'G':
![](http://blog.csdn.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://blog.csdn.net/Images/dot.gif)
{
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
gPressed = TRUE;
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
break;
![](http://blog.csdn.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
default:
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
break;
![](http://blog.csdn.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
CView::OnKeyDown(nChar, nRepCnt, nFlags);
![](http://blog.csdn.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://blog.csdn.net/Images/OutliningIndicators/None.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/None.gif)
COpenGLDemoView::COpenGLDemoView()
![](http://blog.csdn.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/ContractedBlock.gif)
![](http://blog.csdn.net/Images/dot.gif)
{
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
this->gPressed = FALSE;
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
this->fogMode[0] = GL_EXP;
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
this->fogMode[1] = GL_EXP2;
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
this->fogMode[2] = GL_LINEAR;
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
this->fogfilter = 0;
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
this->fogColor[0] = 0.5f;
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
this->fogColor[1] = 0.5f;
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
this->fogColor[2] = 0.5f;
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
this->fogColor[3] = 1.0f;
![](http://blog.csdn.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://blog.csdn.net/Images/OutliningIndicators/None.gif)
第一行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程序雾效持续到距屏幕多远。
![](http://images.cnblogs.com/cnblogs_com/phinecos/070809/200782703.jpg)
![](http://blog.csdn.net/Images/OutliningIndicators/None.gif)
bool gPressed;
![](http://blog.csdn.net/Images/OutliningIndicators/None.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/None.gif)
GLuint fogMode[3]; // Storage For Three Types Of Fog
![](http://blog.csdn.net/Images/OutliningIndicators/None.gif)
GLuint fogfilter;// Which Fog Mode To Use
![](http://blog.csdn.net/Images/OutliningIndicators/None.gif)
GLfloat fogColor[4];// Fog Color
![](http://blog.csdn.net/Images/OutliningIndicators/None.gif)
BOOL COpenGLDemoView::InitGL(GLvoid) // All Setup For OpenGL Goes Here
![](http://blog.csdn.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/ContractedBlock.gif)
![](http://blog.csdn.net/Images/dot.gif)
{
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
if (!LoadGLTextures()) // Jump To Texture Loading Routine ( NEW )
![](http://blog.csdn.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://blog.csdn.net/Images/dot.gif)
{
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
return FALSE; // If Texture Didn't Load Return FALSE
![](http://blog.csdn.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
glEnable(GL_TEXTURE_2D); // Enable Texture Mapping ( NEW )
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient); // 设置环境光
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse); // 设置漫射光
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
glLightfv(GL_LIGHT1, GL_POSITION,LightPosition); // 设置光源位置
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
glEnable(GL_LIGHT1); // 启用一号光源
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
glShadeModel(GL_SMOOTH); // Enable Smooth Shading
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
COLORREF color = ::GetSysColor(COLOR_3DFACE);
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
//glClearColor((float)GetRValue(color)/255.0f,
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
// (float)GetGValue(color)/255.0f,
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
// (float)GetBValue(color)/255.0f,
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
// 1.0);
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
glClearColor(0.5f,0.5f,0.5f,1.0f);
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
glClearDepth(1.0f); // Depth Buffer Setup
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
glEnable(GL_DEPTH_TEST); // Enables Depth Testing
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
glFogi(GL_FOG_MODE, fogMode[fogfilter]); // Fog Mode
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
glFogfv(GL_FOG_COLOR, fogColor); // Set Fog Color
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
glFogf(GL_FOG_DENSITY, 0.35f); // How Dense Will The Fog Be
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
glHint(GL_FOG_HINT, GL_DONT_CARE); // Fog Hint Value
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
glFogf(GL_FOG_START, 1.0f); // Fog Start Depth
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
glFogf(GL_FOG_END, 5.0f); // Fog End Depth
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
glEnable(GL_FOG); // Enables GL_FOG
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
return TRUE; // Initialization Went OK
![](http://blog.csdn.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://blog.csdn.net/Images/OutliningIndicators/None.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/None.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/None.gif)
void COpenGLDemoView::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
![](http://blog.csdn.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/ContractedBlock.gif)
![](http://blog.csdn.net/Images/dot.gif)
{
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
// TODO: Add your message handler code here and/or call default
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
switch(nChar)
![](http://blog.csdn.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://blog.csdn.net/Images/dot.gif)
{
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
case 'G':
![](http://blog.csdn.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://blog.csdn.net/Images/dot.gif)
{
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
if(gPressed==TRUE)
![](http://blog.csdn.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://blog.csdn.net/Images/dot.gif)
{
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
fogfilter=(fogfilter+1)%3;
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
gPressed = FALSE;
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
glFogi (GL_FOG_MODE, fogMode[fogfilter]); // Fog Mode
![](http://blog.csdn.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
break;
![](http://blog.csdn.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
default:
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
break;
![](http://blog.csdn.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
CView::OnKeyUp(nChar, nRepCnt, nFlags);
![](http://blog.csdn.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://blog.csdn.net/Images/OutliningIndicators/None.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/None.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/None.gif)
void COpenGLDemoView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
![](http://blog.csdn.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/ContractedBlock.gif)
![](http://blog.csdn.net/Images/dot.gif)
{
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
// TODO: Add your message handler code here and/or call default
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
switch(nChar)
![](http://blog.csdn.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://blog.csdn.net/Images/dot.gif)
{
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
case 'G':
![](http://blog.csdn.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://blog.csdn.net/Images/dot.gif)
{
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
gPressed = TRUE;
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
break;
![](http://blog.csdn.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
default:
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
break;
![](http://blog.csdn.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
CView::OnKeyDown(nChar, nRepCnt, nFlags);
![](http://blog.csdn.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://blog.csdn.net/Images/OutliningIndicators/None.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/None.gif)
COpenGLDemoView::COpenGLDemoView()
![](http://blog.csdn.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/ContractedBlock.gif)
![](http://blog.csdn.net/Images/dot.gif)
{
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
this->gPressed = FALSE;
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
this->fogMode[0] = GL_EXP;
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
this->fogMode[1] = GL_EXP2;
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
this->fogMode[2] = GL_LINEAR;
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
this->fogfilter = 0;
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
this->fogColor[0] = 0.5f;
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
this->fogColor[1] = 0.5f;
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
this->fogColor[2] = 0.5f;
![](http://blog.csdn.net/Images/OutliningIndicators/InBlock.gif)
this->fogColor[3] = 1.0f;
![](http://blog.csdn.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://blog.csdn.net/Images/OutliningIndicators/None.gif)
第一行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程序雾效持续到距屏幕多远。
![](http://images.cnblogs.com/cnblogs_com/phinecos/070809/200782703.jpg)
![](http://images.cnblogs.com/cnblogs_com/phinecos/070809/200782704.jpg)
相关文章推荐
- OpenGL入门笔记(十四)
- openGl代码入门笔记
- OpenGL1.1: 入门笔记
- opengl入门教程(精)的学习笔记
- OpenGL入门学习(十四)(转)
- OpenGL入门学习笔记一
- OpenGL简明笔记1——入门
- OpenGL入门学习(十四)
- OpenGL入门学习(十四) 【转】
- 【图形学与游戏编程】开发笔记-入门篇3:d3d,opengl以及GPU
- OpenGL入门笔记(一)
- OpenGL入门笔记(六)
- OpenGL入门笔记(十一)
- OpenGL入门笔记(十二)
- OpenGL入门笔记(十六)
- OpenGL入门笔记(一)
- OpenGL入门学习笔记02
- OpenGL入门笔记(十二)
- OpenGL入门笔记(十六)
- OpenGL入门笔记(二)