1. 地形
某种程度上说,目前主流3D引擎都可以被描述为基于地形的3D引擎。由于地形在游戏中使用之普遍,各引擎都对该部分内容给予充分重视,在实现其地形系统时在各种理论、算法上所投入的研究也不遗余力。
1.1 动态LOD
LOD(层次细节,Level of Detail)简单来说,就是对于接近视点或者说需要精确绘制的物体采用高层次细节,而对于远离视点或者说不需要精确绘制的物体采用低层次细节,以提高渲染时的效率。
LOD概念很早就被引入到游戏开发中,在大规模地形的实现中得到广泛应用。地形渲染一般的实现方法是根据高度图建立三角形顶点缓冲,之后在绘制的时候根据LOD建立索引缓冲,再之后渲染。由于在渲染时LOD会参考视点、视锥等选取需要绘制的有效三角形的索引进行绘制,这样一来很多无效三角形在被送入流水线之前就被剔除。理想情况下,不论多大的地形,每一帧渲染的三角形数目也不会有很大波动。
El采用动态LOD对地形进行绘制管理,所采取的理论及实现皆参考潘李亮《基于LOD的大规模真实感室外场景实时渲染技术的初步研究》一文,这里给出链接,不多赘述,并对作者表示感谢。
http://www.hellocpp.net/Articles/Article/145.aspx
地形动态LOD中值得注意的是四叉树管理的实现及T裂缝的修复。解决了这两个问题,基本上就没有什么难点了。
1.2 渲染
El地形采用类似魔兽世界3+1的渲染方式,三张地表细节纹理(草地、泥土、砖块),及一张混合参数纹理,该纹理的RGB通道分表代表前三张纹理的混合权重值,Alpha通道代表地形是否有阴影。
另外,影响地形渲染效果的诸多因素当中,光照其实占了很大部分比重,处理好光照模型,渲染出来的地形会有意想不到的效果。
1.3 看起来很美
最后给出地形LOD的一些讨论。
评估自己的项目自问一下,地形真的有必要做动态LOD吗?动态LOD在渲染前的确能裁剪大量的三角形,但是决定裁剪哪些三角形的步骤却需要在cpu中给出计算,而项目中如果要得到 相对精致的地形,这样的计算量也是很大的。El的地形运算中,动态LOD引发了指数级的降帧。
地形动态LOD,看起来很美。但在实际的项目运用中,作者觉得地形采用静态LOD更为合适。市面上一些引擎就是这么做的,魔兽世界也是如此。魔兽放弃了动态LOD策略,采用二级静态LOD,而魔兽世界的地形效果及效率业界也有目共睹。可能会有人坚持认为类似魔兽的无限连续地形,用动态LOD是再适合不过了。其实作者窃以为,无限连续地形的精髓,不在于LOD而在于地形分块。
关于项目中地形采用静态LOD的讨论,siney在其blog中的观点也很中肯。
http://www.sineysoft.com/blog/post/Terrain_lod.html
最后给出魔兽世界地形渲染方法的一些链接,希望对大家有所帮助。
http://fotoone.spaces.live.com/blog/cns!68DE430B0B5562FB!1234.entry
图1.1 动态LOD地形(高度图粗糙是造成地形不漂亮的重要原因T.T)
图1.2 动态LOD地形(线框模式)
分享到:
相关推荐
综上所述,`javax.servlet-api-3.1.0.jar`, `javax.el-api-2.2.4.jar`, `javax.el-2.2.4.jar`这些文件对于构建基于Java的Web应用程序至关重要,它们提供了与Web服务器通信和处理用户请求的核心功能,同时也支持高效...
openssl-devel-1.0.1e-57.el6.x86_64.rpm离线安装时的相关依赖库: openssl-devel-packages\e2fsprogs-1.41.12-22.el6.x86_64.rpm openssl-devel-packages\e2fsprogs-libs-1.41.12-22.el6.x86_64.rpm openssl-...
springboot 打war部署到apache-tomcat-7.0.69中启动报错:java.lang.NoClassDefFoundError: javax/el/ELManager ... 下载javax.el-api-3.0.0.jar,放到 tomcat/lib包下可以解决,原来的el-api.jar版本较低
包含xinetd-2.3.14-40.el6.x86_64.rpm+telnet-0.17-48.el6.x86_64.rpm + telnet-server-0.17-48.el6.x86_64.rpm,请依次安装, rpm -ivh xinetd-2.3.14-40.el6.x86_64.rpm rpm -ivh telnet-0.17-48.el6.x86_64.rpm ...
linux自带版本,网上很难找到免费的,故上传一下,方便使用。压缩包包含 pcre-7.8-7.el6.x86_64.rpm 和 pcre-devel-7.8-6.el6.x86_64.rpm 和pcre-7.8.tar.gz 三个版本
"kernel-lt-4.4.210-1.el6.elrepo.x86_64.zip" 这个压缩包文件是针对Red Hat Enterprise Linux 6 (RHEL6)系统的一个长期支持(LT)版本的内核更新。这里的"lt"代表"Long Term Support",意味着这个内核版本将会有更长...
64位centos按装下按装64位oracle时,centos系统缺少的rpm包,附件内存放着以下rpm按装包: libaio-0.3.105-2.x86_64.rpm libaio-devel-0.3.105-2.i386.rpm libaio-devel-0.3.105-2.x86_64.rpm libaio-devel-0.3.106-...
oracleasm-2.6.9-42.EL-2.0.3-1.i686.rpm 下载
在查询metalink时你会发现原因是由于缺少了libXp.so.6包,根据Oracle的解决方案需要安装xorg-x11-deprecated-libs-6.8.2-1.EL.13.20.i386.rpm包。不过REDHAT AS4中包含的相应的包版本比较低。于是从Oracle提供的...
1. 错误修复:版本号的升级往往伴随着对已知错误的修复,使得软件更加稳定。 2. 功能改进:新的次要版本可能增加了某些功能或改进了现有功能的性能。 3. 安全更新:随着安全漏洞的发现,新版本可能会包含相关的安全...
socat-1.7.2.3-1.el6.x86_64.rpm
标题 "kmod-oracleasm-2.0.6.rh1-2.el6.x86_64.rpm" 指向的是一个针对Oracle Automatic Storage Management (Oracle ASM) 的内核模块,它被设计用于Red Hat Enterprise Linux 6 (RHEL 6) 平台的64位体系结构。...
xorg-x11-libs-compat-6.8.2-1.EL.33.0.1.i386.rpm
xinetd-2.3.14-29.el6.x86_64 telnet-server-0.17-47.el6_3.1.x86_64 telnet-0.17-47.el6_3.1.x86_64
warning: gcc-c++-4.4.7-3.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY error: Failed dependencies: gcc = 4.4.7-3.el6 is needed by gcc-c++-4.4.7-3.el6.x86_64 libstdc++ = 4.4.7-...
oracleasm-2.6.9-22.EL-2.0.3-1.i686.rpm
在Java世界中,EL(Expression Language)是一种强大的脚本语言...在给定的文件列表中,`javax.el-2.2.4.jar`和`javax.el-api-2.2.4.jar`是EL 2.2版本的实现和API,可以被用来支持和增强Java EE应用中的EL表达式处理。
MySQL-5.5.54-1.el6.x86_64.rpm-bundle.tar linux 安装版本
MySQL-shared-5.6.24-1.el6.x86-64.rpm
glibc-2.12-1.212.el6.i686.rpm资源包,liunx 64位缺少ld-linux.so的安装包