热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

地形有必要做LOD吗?

最近做了个Geomipmap的LOD地形,加上实现LOD用的逻辑时间,渲染帧数FPS跟静态地形真的没啥差别。。甚至fps还更低。。。。转载自:http:www.sineysoft.com

最近做了个Geomipmap的LOD地形,加上实现LOD用的逻辑时间,渲染帧数FPS跟静态地形真的没啥差别。。甚至fps还更低。。。。

 

转载自:http://www.sineysoft.com/blog/post/Terrain_lod.html

今天在qq上和网友聊天交流,发现大家普遍比较关注lod,特别是动态减面的lod,对于刚开始接触3D图形的同学普遍认为LOD很牛,很有必要,对于动态减面得LOD算法更是趋之若骛,其实不然,特别是针对地形(Terrain)的LOD必要性不是很大.

 
对于LOD的好处,我想大家都了解,就是减少提交到显卡得primitives,以减少没桢同屏渲染的三角形数量,借以提高fps,其实影响渲染fps的要素很多,其中最为关键的就是RS(Render State)的切换和Draw Call的调用(D3D9中),而不是三角形的数量,而地形数据因为其特殊性,渲染地形一般不需要切换RS,Draw Call的也相对较少,并且一般地形的顶点数据都在一个Vertex Buffer内,所以渲染地形的开销很小,在我们的游戏中,渲染地形不会带来任何fps的损失(6系列显卡,低端Mx440大概5fps左右),在这种情况如果再考虑动态减面重构Vertex Buffer则得不偿失了,对于地形的LOD最多建议是静态修改Index Buffer,即提供多级Index Buffer的方法达到减面的效果,魔兽(WOW)就是这样干的,所以我个人极力不提倡使用动态减面的算法修改地形,不管是设计复杂度,还是时间开销和最后带来的好处都是得不偿失的.
 
我最近研究Farcry2引擎,发现他同屏渲染80-100万面每桢,其中地形占用70-90万面,可见地形的三角形数量确实庞大,但有趣的是,即使不渲染地形,桢率也就5fps(7系列显卡)左右的提高,而且Farcry2的地形是没有做LOD的,不过其模型倒是做了LOD.
 
最后给我我的结论,关于LOD:
 

模型lod(静态)有必要,动态很费,地形lod没有必要(有静态也无所谓),因为地形在现代显卡里渲染很快,基本没有rs的切换.

与其考虑地形LOD,不如考虑地形得遮挡剔除,这方面的意义远比LOD大,我们敬仰的WOW也是这样干得.

 关于地形遮挡剔除的算法,可以参考我之前的博客,有详细的算法讲解,市面也有很多成熟得3rd套件可以使用.

 

评论:

ROAM算法过于古老了,不适合现在的显卡硬件加速体系,只适合古老的cpu计算...现在已经没有用纯软件加速来进行3D地形渲染了吧?
其实siney大大所说的静态LOD,类似于楼上所说的Geomipmap,类似于贴图的mipmap原理。总之是个空间换时间的道理。

不过对于siney的动态LOD很费,和farcry2没有使用地形LOD,我不敢苟同。
按照farcry2的地形精度,如果没有做LOD的话,我不认为它能够在现在的顶级配置机器下流畅运行。除了视觉剔除,应当还有其他的渲染优化方法。LOD是逃不开的。

 

1. 现代的LOD计算方法是可以完全拿到显卡里面作的,以后越来越多的显卡可以具备该功能。
2. 您所说的重构vertex不是问题,成熟的游戏,不会每贞都重新计算LOD并更新vertex,因为主角移动的速度是有限的,不会从一个地方突然切换到另外一个地方,也就意味着LOD层次不必要每次都跳变,所以一般是10秒钟时间重新计算一次LOD的vertexbuffer,这样的开销是极小的。

 

siney Says: 

没错,现代lod可以在显卡做,意味着需要gs的显卡,但这并不是free的,而且我们需要了解影响渲染效率的瓶颈,做lod固然可以提高效率,但是不做也有很多方法可以抵消效率损失。

 

 

 


推荐阅读
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
author-avatar
书友32976730
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有