大规模地形渲染

地形在计算机图形学中是一种比较特殊的物体,通常地形被设计为规则的网格,网格上每个顶点都根据不同的高度在网格的法线量方向进行位移.地形的高度被保存为一个名为高度图的文件中.当地形的网格结构越密集,地形的外观就显得越平滑.但同时也增加了需要被渲染的顶点和三角形数量.怎么才能在保证地形的外观平滑的前提下尽量减少需要渲染的数据呢,LOD就是基于这种想法应运而生的算法.

 

第一章   建立地形网格

1-1

如上图,先将所有的虚线当做实线看待.我们可以定义一个5X5的地形网格结构.该结构有25个顶点,其中每个顶点的X,Y坐标  [0,5]. Z坐标也就是所谓的高度值被保存在一个float[5X5]的数组中(根据程序要求的精度,可以是unsigned short[5X5],int[5X5]….).从上图可以看出,不论高度值如何变化,地形网格在XY投影平面的结构是固定的,正是这个特点,使得地形成为一种特殊的物体.

上面的地形网格图是地形中QuadTree(4叉树)的基础.在后面,我会讲到基于BinaryTree(2叉树)及更复杂的Diamond等结构的地形网格.不过现在不用管它,让我们从最简单的QuadTree开始.

继续看图1-1,我们把整个网格结构的中间那个点标为点0,它代表一共Block结构.Block结构有4个子节点,一个父节点.一个关于Block跨度的数值,还有一个标示Block的位置的坐标值(通常我们取Block左下角的那个点坐标).

Struct Block

{

   Block* pkBlockChild[4];

   Block* pkBlockParent[1];

   Int iBlockStride;

   Int iBlockX,iBlokY;

}

如果我们假设图1-1中网格结构X,Y方向都代表4个单位,Block 0的成员为:4Child 1,2,3,4.

1ParentNULL,iBlockStride2(Block边长的一半).iBlockX = 0,iBlockY = 0;现在它的4child BlockiBlockStride都为1.也就是说这4Child都不能在细分下去了.所以它们都是QuadTree上的叶子节点.

即没有子节点,有且仅有一个父节点.

现在我们来渲染整个网格.对于每个叶子Block.我们把它看成是个TriangleFan.因此我们对每个Block

都可以用以下伪代码

glBegin(GL_TRIANGLE_FAN);

glVertex3f(Center);

glVertex3f(LowerLeft);

glVertex3f(LowerCenter);

glVertex3f(LowerRight);

glVertex3f(MidRight);

glVertex3f(UpperRight);

glVertex3f(UpperCenter);

glVertex3f(UpperLeft);

glVertex3f(MidLeft);

glEnd();

注意上面的顶点遍历顺序是逆时针的.


       够简单吧.^_^ 

posted @ 2005-04-18 16:20  BadKeeper  阅读(2416)  评论(1编辑  收藏  举报