以文本方式查看主题 - 中文XML论坛 - 专业的XML技术讨论区 (http://bbs.xml.org.cn/index.asp) -- 『 C/C++编程思想 』 (http://bbs.xml.org.cn/list.asp?boardid=61) ---- 如何实现三维中的雾化和纹理效果? (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=87762) |
-- 作者:葛靖青001 -- 发布时间:11/16/2010 12:00:00 PM -- 如何实现三维中的雾化和纹理效果? 【转自互联网】 雾化效果 在真实世界中观察地面目标并不是在真空中进行的,而是有大气的存在,无论空气是干燥还是湿润,总会有或多或少的水蒸汽存在,而且还有少量的尘埃存在。它们的存在使得我们在观察远景目标时将不可避免地产生白茫茫的模糊效果,这种效果在OpenGL中也被称为"雾化"。虽然在现实世界中雾化现象妨碍了我们对远景目标的观察效果,但在仿真处理上如果缺少此效果反而会令人感觉不是那么真实。因此,这里就对雾化效果的实现做一个简单的介绍: if (m_bFogMode == FALSE){ 这段代码允许使能或禁用雾化效果。如果需要启用雾化效果,首先需要通过glEnable()函数使能雾化效果(调用GL_FOG参数),并需通过glFogi()和glFogfv()指定采用何种方式的雾化效果和雾化颜色。这里采用的是线性变化方式,因此还要通过glFogf()指定按线性变化时计算公式的参量。最后调用的glHint()函数将对雾化效果的质量作出规定。如果需要禁用雾化效果,只需简单的调用glDisable()将GL_FOG选项禁用即可。下图分别为未使用雾化效果和使用了雾化效果的场景。可以看出,启用了雾化效果后的场景更加逼真: 由于任何真实场景都是有着复杂纹理的,因此为了达到具有真实感效果的仿真程度还必须对纹理的使用进行处理。这里使用的纹理必须是长、宽相等且均为2的整数次幂的位图。通常多采用当地区域的航拍照片或当地地图等作为纹理进行贴图。下面首先介绍一下纹理贴图的一般技术实现过程。 在使用纹理时,首先需要指定待使用的纹理图象,并通过auxDIBImageLoad()函数将其载入到内存并保留其指针。将该指针作为参数去调用glGenTextures()创建一个纹理。接下来,通过对glBindTexture()的调用使用来自位图数据生成的典型纹理,并进一步通过glTexImage2D()生成纹理,同时还必须指定当缩小的比原始纹理小时或放大的比原始纹理大时所要采取的滤波方式。最后释放纹理图象所占用的资源。为了应用纹理,还必须做一些其他的辅助性工作,如启用阴影平滑、启用纹理映射、指定前后表面的建模方式等等。下面给出这部分工作的主要实现代码: glShadeModel(GL_SMOOTH); // 启用阴影平滑 纹理如果创建成功,应当在重绘场景的同时完成纹理到网格单元的贴图,而且这部分工作应当在执行显示列表之前完成。这部分处理的重点在于从纹理到网格单元的贴图,如果处理不好,将会出现纹理贴反、贴倒甚至有漏贴情况出现。为了确保贴图的正确,一般可以比照初始化该模型显示列表的那部分代码,并采取与之相同的网格定义和顶点定义顺序。例如,下面这段代码使用的就是与InitTerrainList()中相同的三角带网格,并且按照左下、左上、右下、右上的次序进行贴图: glBindTexture(GL_TEXTURE_2D, m_nTexture[0]); // 选择纹理 其中,glTexCoord2f()定义的是在纹理中的坐标,glVertex3d()定义的是在网格模型中的坐标,通过这两组坐标的定义将纹理和与之对应的网格绑定起来。使用了纹理的地景模型不仅更加逼真,而且可以通过使用不同类型的纹理而获取到不同的信息。下图给出的是经过纹理贴图后的地景模型。其中左图采用的纹理是由法国SPOT遥感卫星PAN全色波段采集的该地区平面遥感影象,通过纹理贴图,可以三维仿真的形式观看该地区的卫星遥感效果。右图将该地区的地图作为纹理使用,贴图后的地景模型可以作为三维电子沙盘使用。
小结 本文在前面几篇文章的基础之上进一步实现了雾化、纹理贴图等OpenGL高级技术。通过给出的仿真结果可以看出这些高级技术的应用极大改善了地景模型三维仿真的真实感,有效增加了对地景信息的综合利用价值。通过对本系列文章的介绍,读者应当能够对此类三维地景仿真软件的实现、设计过程有一个基本的认识,并可在此基础之上根据具体需求编写出适合自己的GIS应用程序。本文所述程序在Windows 2000 Professional + SP4下由Microsoft Visual C++ 6.0编译通过。 |
W 3 C h i n a ( since 2003 ) 旗 下 站 点 苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》 |
6,347.656ms |