zoukankan      html  css  js  c++  java
  • LOD

           LOD技术指用若干不同复杂度的模型来表示同一对象的技术。此技术主要根据视点距离对象位置的变化调用不同复杂度的模型,即在较远时调用低复杂度模型,在较近时调用高复杂度模型。LOD技术主要通过设置模型的Switch In Switch Out值来实现不同视点距离显示不同复杂度模型。在实际开发中注意相邻复杂度模型中低复杂度模型的多边形数目是高复杂度模型多边形数目的75%。采用该技术不但可以增强场景的逼真度,也可以减少场景绘制的多边形的数量,既提高了可视性又节约了系统资源。
           在系统开发过程中,为了解决LOD层次结构模型在运行时的“Popping(突弹)”效应,即在Switch转换时视觉上的不连续性,采用增大Switch距离和Morphing两种方法。增大Switch距离只是将不同复杂度模型间的转换距离置远,使人眼不易觉察。Morphing方法是一种基于可视化合并一个LOD到另一个LOD的方法,能从根本上解决Popping效应。为了实现Morphing LOD,某些多边形的顶点被定义为Morphing顶点(一般取复杂度低的LOD模型上最靠近视点的那些顶点),当较高LOD出现时,系统首先显示Morphing顶点(位于较低的LOD上),然后逐步更新视景,直到把较高的LOD顶点全部显示为止。这样可以解决视觉上的突变问题。

    LOD包括地形LOD,模型LOD,材质LOD,骨骼LOD等。地形LOD方法很多,如二元三角细分算法。模型LOD,可以使用自动减面算法对模型在不同距离时进行处理。也可以采用让美工手动对模型处理,分成多级模型。材质LOD,指渲染得复杂度控制,如远距离把逐像素光照(PPL)变为顶点光照,多层纹理变为单层纹理。骨骼LOD指逐级减少骨骼数量。对于复杂场景LOD的效果会非常明显

    遍历,寻找需要去掉的面
    找到三个点,补全对应的相邻三角形
    根据某种原则,寻找下一个需要去掉的三角形


    首先,在没有优化过的MESH中,每个面(三角形)都有一个Attribute_ID,记录它属于那一个Subset,DrawSubset(i)操作把每个的Attribute_ID和i比较,如果相等就绘制该面。显然这样是一种效率低下的方法,改进办法就是把这些面做一次排序,然后记录每个Subset从哪里开始包含多少个面就可以了,这样画来当然要快一些了   :)  
      这是最简单的优化方法了,一般说来优化mesh   一般有这样一些可能的方法  
         
      1、Cache   用显存空间换取速度,一般说来,场景中有很多面是“不动”的,这个“不动”的意思可能有些复杂,对于着渲染管道的各个阶段,各种“不动”都可能发生,比如面片的坐标,面片的颜色,面片的贴图,上面的光线等等。于是我们可以建立起一些缓冲的机制来,每次绘制的时候,在各个阶段先看看有没有变化,如果没有的话就直接套用上次的结果。这样会给速度带来可观的提高。  
      2、使用三角形条带来绘制网格。   三角形条带可以说不会减少多少绘制的工作量,但是可以减少数据传输量。一般说来多边形处理,象素填充率和显存数据传输率是最容易遇到的瓶颈。  
      3、使用   Progressive   Mesh,也就是实时的减少mesh上的面,少画了面当然能提高绘制速度。  
       
      D3D   中的   ID3DXPMesh   做了不错的封装,不过在将一个MESH转换为PMesh之前还有一些工作要做,要不然可能转化出错。  
       
      D3DXCleanMesh   清除mesh里面多个三角型共享一个点的情况,并为此添加新的点。通过这个函数每个面都对应三个不同的点,
    虽然所有的点中显然有很多重复的。  
      D3DXWeldVertices   焊接mesh中的顶点,如果源mesh中的点和面都是正常的,这个操作会得到进行   D3DXCleanMesh   操作之
    前的mesh。实际中可能存在这样的情况,A、B两点的位置贴图什么都相同,也就是说他们就是同一个点,但是在mesh中占个两个位
    置。假设各有若干个面分别引用了A和B。在正常情况下我们看不出什么来,因为他们重合在一起。但是如果不把他们合起来的话,
    在PMESH中就可能产生严重问题。因为pmesh是依靠移动顶点,产生退化的三角形(有两个顶点重合在一起),然后将这样的三角形
    剔除这样的方式来进行的,如果它很不幸运的移动了A点,这时由于B点没有跟着动,这样无疑会产生一条大大的裂缝,这样的的情
    况是我们所不能接受的,我们一定要想办法把所有的A、B这样的情况合并为一个点。于是用了先D3DXCleanMesh   +  
    D3DXWeldVertices   这样看似多余的做法。  
       
      D3DXValidMesh   既然有移动点的操作,我们必须保证面对顶点的引用都是正确有效的。所以使用这个D3DXValidMesh  
    来检查一下,顺便把退化的面也踢了。  
      在此之后,就可以放心大胆的使用D3DXGeneratePMesh   来创建pmesh了。  
      D3DXComputeBoundingSphere   合优化没有关系,它用来计算一个mesh的包围球。这个例子中利用这个包围球来设置摄象机的位
    置   :)

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/udking/archive/2010/12/01/6048187.aspx

    再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

  • 相关阅读:
    [NOI2012] 美食节
    [NOI2008] 志愿者招募
    P3834 【模板】可持久化线段树 2(主席树)
    P3919 【模板】可持久化线段树 1(可持久化数组)
    P4168 [Violet]蒲公英
    轻重链剖分
    沉舟侧畔千帆过 病树前头万木春
    P2119 魔法阵 (0.1s 虐杀过程)
    两行虐杀儒略历
    CSP2020 S-2 爆零(日)记 (已完结)
  • 原文地址:https://www.cnblogs.com/skiwnchiwns/p/10345153.html
Copyright © 2011-2022 走看看