变形记:简单快速的地形LOD连续变形(原创)

在地形渲染中为了减轻渲染负担其中个技术是就LOD但其带了个问题就是会产生地形”跳动”地形LOD精度发生变化时镶嵌密度也发生了变化要解决这个问题有个思路方法就是当高精模型向底精模型变化时不是突然变化过去而是慢慢渐变而来这样可以极大减少”跳动”通过设置适当渐变距离可以做到让观察者感觉不到地形变化

有关这个问题在篇文章里面也有介绍:TerrainGeomorphingheVertexShader[1]但是原文介绍思路方法过于复杂而且不适合用硬件加速但是这仍然是篇学习地形渲染好文章下面提出种更加简单快速思路方法来解决这个问题使用这个思路方法有个前提条件就是地形块的间LOD级别相差不能大于1

解决这个问题最基本思想就是:对高精度地形块进行形变来模拟低精度地形块,当高精地形和低精地形形态完全样时地形块LOD才变为低精度设置高精度地形块高度为H1,低精度地形块高度为H2最后根据渐变距离求出个插值t[0,1]最后地形高度就为H=lerp(H1,H2,t)

为了加速渲染顶点形变过程由vs去计算设置地形最大LOD级别为5也就说有4种形变可能:0->1,1->2,2->3,3->4这样我们可以把 4种形变高度值存到个float4(yMove)中

对于如何求取低精度地形高度值可以这样计算:先求出顶点是属于那个地形 4方面然后求出其在 4方面上uv坐标最后用 2次线性插值来得到 4方面内任意高度值比如:个地形 4方面这 4个高度值分别为h00,h10,h01,h11设u为 4方面x方向坐标[0,1],v为 4方面y方向坐标[0,1]那么最后高度值:
h(u,v)=(1.0f-v)*((1.0f-u)*h00+u*h10)+v*((1.0f-u)*h01+u*h11)

在计算好形变高度值后就可以在vs内计算形变高度值了在计算的前还需要传入两个参数:
float4MorphStart,MorphInvRange其中MorphMin表示形变起始距离比如(50,100,150,200)
就表示地形在50处开始0->1形变100处1->2形变,150处2->3,依此类推MorphInvRange是形变距离范围
倒数比如上例:MoprhInvRange=(1/50,1/50,1/50,1/50)
在vs中计算高度值代码如下:
voidvsMain(infloat3Pos:POSITION0,
infloat4yMove:POSITION1)
{
floatviewDist=length(Eye-Pos);
float4moprh=saturate((viewDist-MorphStart)*MorphInvRange);
Pos.ydot(yMove,morph);
}
根据每个顶点对眼睛距离来决定最后形变值可以保证只要顶点位置相同最后形变后位置也定相同,避开了文献[1]中地形边界接缝等等麻烦问题注意在vs中计算morph为什么要用saturate,是顶点缓冲中Pos.y是最高精度地形高度值比如要从1->2级除了要加上1->2形变高度值外还要加上0->1高度差值,而且2->3,3->4形变高度值应该为0上面这个式子正好能满足上面要求情况

处理完顶点形变后还有个工作要做就是要根据眼睛和地形块最小距离来求地形块LOD,设置眼睛和地形块最小距离为d,那么求地形lod代码如下:
(d<MorphStart.y)//0->1
lod=0;
(d<MorphStart.z)//1->2
lod=1;
(d<MorphStart.w)//2->3
lod=2;
(d<MorphStart.w+50)//3->4(50为最后级形变距离)
lod=3;

lod=4;

现在似乎可以做到消除地形“跳动”现像了但是有点还需要注意那就是光照上面做工作只是消除了几何形变产生“跳动”还有个产生“跳动”感觉是光照颜色如果你是在vs内计算顶点光照那么还是会有“跳动”顶点密度变了光照效果肯定不要解决这个问题就需要用光照图来代替顶点光照但是这样就限制了地形光照是静态如果你还是想要动态地形光照那就需要用地形法向图在ps内动态计算,注意:法向图边界地方要特殊处理具体原因不想多说了(写太累了:)
个简单快速地形LOD连续变形解决方案希望对你能有所帮助!如果有疑问或更好想法可以和我联系:
Email:[email protected]
QQ:723520227


Tags: 

延伸阅读

最新评论

发表评论