永远也不完美的程序

不断学习,不断实践,不断的重构……

常用链接

统计

积分与排名

好友链接

最新评论

LOD地形设计与实现

地形从一开始研究,到实现,分了好多个版本,重构了好多次……主要问题在于对LOD数据结构的不熟悉和对索引用法的不熟悉。经过一系列的研究与学习,总结了如下实现LOD的方法:
#动态填充索引——在裁剪过程中求出被渲染的地形块。
#分块实现地形,每块有一定的渲染格。

下面一步步写出实现过程。
1、定义数据结构,主要是地义地形的块并实现四叉树。
2、写好VertexBuffer和IndexBuffer,主要是一边渲染一边填充IndexBuffer,根据裁剪出来的地形块来填充。
3、写好LOD算法,主要是实现LOD的计算方法。
4、写好裂缝修补算法。花在该项时间最长最麻烦。
5、贴纹理写shader。

地形block数据结构如下:

class CTerrainBlock
{
public:
    

private:
    
float  m_fCellSpacing;  //地形网格长度
    float  m_fSphereHalf;    //裁剪的半径
    float  m_fDeltaH;    //高度差
    int    m_nLODLevel;    //LOD层数

    vector
<CTerrainCell*> m_Child;   //子结点

    
int   m_dwSeq;    //索引号,左上角点为索引

    
int   m_nRealCell;   //实际每行的渲染格数,根据LOD层数定
    DWORD m_dwCellsPerRender;           //每个渲染块的最小格数

    vector
<DWORD>      m_vtCorner;     //四个角的索引,顺序为从左上角开始,顺时针

    
int              m_nLeftIndexCount;           //每个渲染格增加的顶点数,一般是1或3
    int              m_nRightIndexCount;
    
int              m_nBottomIndexCount;
    
int              m_nTopIndexCount;

    
int              m_nNeighbor[4];     //分别是上、右、下、左,必须是相同一层的

}

地形渲染的流程如下:
首先用一个递归函数计算出要渲染的block并计算出其LOD值,代码如下:
oid CTerrain::DrawTerrain(CTerrainBlock* pNode)
{
    
if (pNode == NULL)
    
{
        
return;
    }

    
if (结点是要渲染的块)
    
{
        
if (在视锥体内)   //判断是否在视锥体内
        {
            
for (int i = 0; i < 4; i++)
            
{
                DrawTerrain(pNode
->GetChildNode(i));
            }

        }
    
        
    }

    
else             //最小格,直接插入队列
    {
        计算LOD值;
        m_vtDraw.push_back(pNode);
    }


}

整个渲染代码如下:
void CTerrain::Render()
{
        DrawTerrain(m_pRoot);
    
        修补裂缝;
     
        填充索引;

        设置shader;

    设置顶点缓冲;

    设置纹理;

    DrawIndexedPrimitive();
    
}

效果图以后再附上,欢迎有兴趣的朋友与我讨论算法。
索引填充如果是1025X1025的地形相对慢了点。

posted on 2008-08-18 17:08 狂烂球 阅读(3365) 评论(11)  编辑 收藏 引用 所属分类: 图形编程

评论

# re: LOD地形设计与实现 2008-12-06 10:01 gillianmin

能不能把你的LOD程序给我发一份呢,谢谢啊,非常感谢。邮箱:gillianmin@gmail.com  回复  更多评论   

# re: LOD地形设计与实现 2009-04-17 13:32 friend

能不能把你的LOD程序给我发一份呢,现在正在研究地形图,谢谢,非常感谢.
邮箱:rainlinemy@yahoo.com.cn  回复  更多评论   

# re: LOD地形设计与实现 2009-05-05 09:22 jiang

难道你会给我发一份,
exljhb@126.com  回复  更多评论   

# re: LOD地形设计与实现 2009-06-02 15:22 fei

我最近也在做这个啊,能不能发一份给我呢zhyfree@163.com谢谢啦  回复  更多评论   

# re: LOD地形设计与实现 2010-01-20 12:29 chenkang

LZ能给我发一份吗?谢谢,我也在研究。。。chenkangapple@126.com  回复  更多评论   

# re: LOD地形设计与实现[未登录] 2010-10-30 15:57 Zero

能给我发一份不 450223028@qq.com  回复  更多评论   

# re: LOD地形设计与实现 2010-11-03 17:19 陈安太

大哥,小弟最近也在研究这方面的知识,给我一份代码好吧,谢谢!我的邮箱:
linyiantai@163.com  回复  更多评论   

# re: LOD地形设计与实现 2010-12-16 16:00 xiaodiezi

楼主能发一份代码给我吗?谢谢!
986772462@qq.com  回复  更多评论   

# re: LOD地形设计与实现 2012-04-18 09:58 李玉

楼主能发一份代码给我吗?谢谢!我最近也在学习lod地形,可是搞不懂。
邮箱是1610684305@qq.com
  回复  更多评论   

# re: LOD地形设计与实现 2012-10-17 17:15 远足

也发我一份吧,一直搞不太懂这个。
邮箱:472502272@qq.com  回复  更多评论   

# re: LOD地形设计与实现 2013-09-23 09:37 QQQQ

正在学习四叉树LOD地形,同求一份代码,多谢~~~
423322338@qq.com  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理