这课来自Chris Aliotta。
难道你不想把“雾”加入到你的OPENGL程序中吗?那么在这颗里我将要为您展现如何实现这项功能。这是我第一次写教程,而且相对来说我也是OPENGL/C++程序设计新手,所以如果您发现有什么错误的话,请让我知道。这颗的代码是基于第7颗的。
DATASETUP: 我们将要设定我们用来保存关于雾的信息的所有变量。变量:fogMode 用来保存3种有关雾的类型:GL_EXP,GL_EXP2,GL_LINEAR。稍后我会解释这三种类型间的差别。这个变量将在代码的开头声明。变量:fogfilter将被用做记录您所选择的雾的类型的索引。变量fogColor会保存任何您想要的雾的颜色。我们当然也要在代码开始处加入一个布尔类型的变量gp使我们能够知道键“G”是否被按下。
bool gp; // G Pressed? ( New ) GLuint filter; // Which Filter To Use GLuint fogMode[]= { GL_EXP, GL_EXP2, GL_LINEAR }; // Storage For Three Types Of Fog GLuint fogfilter= 0; // Which Fog To Use GLfloat fogColor[4]= {0.5f, 0.5f, 0.5f, 1.0f}; // Fog Color
DrawGLScene Setup : 现在我们已经声明完了我们的变量,接下来我们将要开始初始化OPENGL了。命令:glClearColor()将会稍做改变以用来将屏幕颜色清除为雾的颜色以获得更好的视觉效果。这里并没有复杂的代码用来进行雾的操作,而且您会发现,这将是非常简单的。
glClearColor(0.5f,0.5f,0.5f,1.0f); // We'll Clear To The Color Of The Fog ( Modified )
glFogi(GL_FOG_MODE, fogMode[fogfilter]); // Fog Mode glFogfv(GL_FOG_COLOR, fogColor); // Set Fog Color glFogf(GL_FOG_DENSITY, 0.35f); // How Dense Will The Fog Be glHint(GL_FOG_HINT, GL_DONT_CARE); // Fog Hint Value glFogf(GL_FOG_START, 1.0f); // Fog Start Depth glFogf(GL_FOG_END, 5.0f); // Fog End Depth glEnable(GL_FOG); // Enables GL_FOG
让我们讨论一下上面代码的开始3行。第一行glEnable(GL_FOG)解释起来非常容易,它告诉OPENGL开始进行雾的计算。 第二行glFogi(GL_FOG_MODE,fogMode[fogfilter])确定了雾的类型。开始的时候我们声明了数组fogMode,他保存了GL_EXP,GL_EXP2,GL_LINEAR。在我们使用这些值之前,让我稍做解释:
1:简单渲染在屏幕上显示的雾的模式。他无法给予我们非常漂亮的雾的效果,但是却可以在古老的电脑上工作的很好。 2:比1提高了一点,将渲染全屏幕的雾,然而她会给予场景更深的效果。 3:这是最好的雾的渲染模式,对象在雾中消隐的很好。
第三行glFogfv(GL-FOG_COLOR,fogcolor)设定了雾的颜色,开始的时候我们把它设定为(0.5,0.5,0.5,1.0),使用变量FOGCOLOR将给予我们漂亮的灰色。
接下来我们来看最后四行代码:
glFogf(GL_FOG_DENSITY, 0.35f)确定了雾的密度,增大这个数值雾将会变的更浓,减小它雾将会变的更淡。 glHint (GL_FOG_HINT, GL_DONT_CARE)确定了雾的渲染方式,我使用GL_DONT_CARE是因为我并不关心建议值。然而这里有一个用来解释关于这个项的不同值之间的区别: GK_DONT_CARE让OPENGL自己来确定雾的渲染方式:每顶点或是每像素。 GL_NICEST对没一像素进行雾的渲染,它看起来是极棒的。 GL_FASTEST对没一顶点进行雾的渲染,它速度较快,但是不够美丽。
行glFogf(GL_FOG_START, 1.0f)确定了雾的开始初离屏幕有多近。你可以将这个值改变为任意你想要的值,这个值描述了那个你想要使雾开始的位置。下一行与上行相似:glFogf(GL_FOG_END, 5.0),它告诉OPENGL雾能离开屏幕有多远。
Keypress Events (下面给出代码,我逐行解释)
if (keys['G'] && !gp) // Is The G Key Being Pressed? { gp=TRUE; // gp Is Set To TRUE fogfilter+=1; // Increase fogfilter By One if (fogfilter>2) // Is fogfilter Greater Than 2? { fogfilter=0; // If So, Set fogfilter To Zero } glFogi (GL_FOG_MODE, fogMode[fogfilter]); // Fog Mode } if (!keys['G']) // Has The G Key Been Released? { gp=FALSE; // If So, gp Is Set To FALSE }
这就是全部了!我们结束了我们的课程,现在你已经在你的OPENGL程序中有了雾。我敢说这是决不费事的。如果你有任何问题或者意见,请来信或者访问我的网站 。 |