OpenGL入门笔记(十四)

我们将从设置保存雾的信息的变量开始。变量fogMode用来保存三种类型的雾:GL_EXP,GL_EXP2GL_LINEAR。变量fogfilter将用来表示我们使用的是哪种雾类型。变量fogColor保存雾的颜色。还加了一个布尔类型的变量gPressed用来记录'g'键是否被按下。

None.gif bool gPressed;
None.gif
None.gifGLuintfogMode[
3 ]; // StorageForThreeTypesOfFog
None.gif
GLuintfogfilter; // WhichFogModeToUse
None.gif
GLfloatfogColor[ 4 ]; // FogColor

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

None.gif BOOLCOpenGLDemoView::InitGL(GLvoid) // AllSetupForOpenGLGoesHere
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
if(!LoadGLTextures())//JumpToTextureLoadingRoutine(NEW)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
returnFALSE;//IfTextureDidn'tLoadReturnFALSE
ExpandedSubBlockEnd.gif
}

InBlock.gifglEnable(GL_TEXTURE_2D);
//EnableTextureMapping(NEW)
InBlock.gif

InBlock.gifglLightfv(GL_LIGHT1,GL_AMBIENT,LightAmbient);
//设置环境光
InBlock.gif
glLightfv(GL_LIGHT1,GL_DIFFUSE,LightDiffuse);//设置漫射光
InBlock.gif
glLightfv(GL_LIGHT1,GL_POSITION,LightPosition);//设置光源位置
InBlock.gif
glEnable(GL_LIGHT1);//启用一号光源
InBlock.gif

InBlock.gifglShadeModel(GL_SMOOTH);
//EnableSmoothShading
InBlock.gif
COLORREFcolor=::GetSysColor(COLOR_3DFACE);
InBlock.gif
//glClearColor((float)GetRValue(color)/255.0f,
InBlock.gif
//(float)GetGValue(color)/255.0f,
InBlock.gif
//(float)GetBValue(color)/255.0f,
InBlock.gif
//1.0);
InBlock.gif
glClearColor(0.5f,0.5f,0.5f,1.0f);
InBlock.gif
InBlock.gifglClearDepth(
1.0f);//DepthBufferSetup
InBlock.gif
glEnable(GL_DEPTH_TEST);//EnablesDepthTesting
InBlock.gif
glDepthFunc(GL_LEQUAL);//TheTypeOfDepthTestingToDo
InBlock.gif
glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);//ReallyNicePerspectiveCalculations
InBlock.gif

InBlock.gif
InBlock.gifglFogi(GL_FOG_MODE,fogMode[fogfilter]);
//FogMode
InBlock.gif
glFogfv(GL_FOG_COLOR,fogColor);//SetFogColor
InBlock.gif
glFogf(GL_FOG_DENSITY,0.35f);//HowDenseWillTheFogBe
InBlock.gif
glHint(GL_FOG_HINT,GL_DONT_CARE);//FogHintValue
InBlock.gif
glFogf(GL_FOG_START,1.0f);//FogStartDepth
InBlock.gif
glFogf(GL_FOG_END,5.0f);//FogEndDepth
InBlock.gif
glEnable(GL_FOG);//EnablesGL_FOG
InBlock.gif
returnTRUE;//InitializationWentOK
ExpandedBlockEnd.gif
}

None.gif
None.gif
None.gif
void COpenGLDemoView::OnKeyUp(UINTnChar,UINTnRepCnt,UINTnFlags)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
//TODO:Addyourmessagehandlercodehereand/orcalldefault
InBlock.gif
switch(nChar)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
case'G':
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
if(gPressed==TRUE)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
InBlock.giffogfilter
=(fogfilter+1)%3;
InBlock.gifgPressed
=FALSE;
InBlock.gifglFogi(GL_FOG_MODE,fogMode[fogfilter]);
//FogMode
ExpandedSubBlockEnd.gif
}

InBlock.gif
break;
ExpandedSubBlockEnd.gif}

InBlock.gif
default:
InBlock.gif
break;
ExpandedSubBlockEnd.gif}

InBlock.gif
InBlock.gifCView::OnKeyUp(nChar,nRepCnt,nFlags);
ExpandedBlockEnd.gif}

None.gif
None.gif
None.gif
void COpenGLDemoView::OnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
//TODO:Addyourmessagehandlercodehereand/orcalldefault
InBlock.gif
switch(nChar)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
case'G':
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifgPressed
=TRUE;
InBlock.gif
break;
ExpandedSubBlockEnd.gif}

InBlock.gif
InBlock.gif
default:
InBlock.gif
break;
ExpandedSubBlockEnd.gif}

InBlock.gif
InBlock.gifCView::OnKeyDown(nChar,nRepCnt,nFlags);
ExpandedBlockEnd.gif}

None.gif
None.gifCOpenGLDemoView::COpenGLDemoView()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
this->gPressed=FALSE;
InBlock.gif
InBlock.gif
this->fogMode[0]=GL_EXP;
InBlock.gif
this->fogMode[1]=GL_EXP2;
InBlock.gif
this->fogMode[2]=GL_LINEAR;
InBlock.gif
InBlock.gif
this->fogfilter=0;
InBlock.gif
InBlock.gif
this->fogColor[0]=0.5f;
InBlock.gif
this->fogColor[1]=0.5f;
InBlock.gif
this->fogColor[2]=0.5f;
InBlock.gif
this->fogColor[3]=1.0f;
ExpandedBlockEnd.gif}

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设为(<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /><chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue=".5" unitname="F">0.5f</chmetcnv>,<chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue=".5" unitname="F">0.5f</chmetcnv>,<chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue=".5" unitname="F">0.5f</chmetcnv>,<chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="1" unitname="F">1.0f</chmetcnv>),这是一个很棒的灰色。

接下来我们看看最后的四行。glFogf(GL_FOG_DENSITY, <chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue=".35" unitname="F">0.35f</chmetcnv>);这行设置雾的密度。增加数字会让雾更密,减少它则雾更稀。

glHint (GL_FOG_HINT, GL_DONT_CARE); 设置修正。我使用了GL_DONT_CARE因为我不关心它的值。

gl_dont_care - OpenGL决定使用何种雾效(对每个顶点还是每个像素执行雾效计算)和一个未知的公式

gl_nicest - 对每个像素执行雾效计算(效果好)

gl_fastest - 对每个顶点执行雾效计算 (更快,但效果不如上面的好)

下一行glFogf(GL_FOG_START, <chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="1" unitname="F">1.0f</chmetcnv>);设定雾效距屏幕多近开始。你可以根据你的需要随意改变这个值。下一行类似,glFogf(GL_FOG_END, <chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="5" unitname="F">5.0f</chmetcnv>);告诉OpenGL程序雾效持续到距屏幕多远。

200782703.jpg

200782704.jpg

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值