简单快速的地形LOD连续变形.docx

  1. 1、本文档共2页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

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

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

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

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

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

对于如何求取低精度地形的高度值可以这样计算:先求出顶点是属于那一个地形四方面,然后求出其在四方面上的uv坐标,最后用二次线性插值来得到四方面内任意一点的高度值。比如:一个地形四方面这四个高度值分别为h00,h10,h01,h11。设u为四方面x方向的坐标[0,1],v为四方面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-gt;1形变,100处1-gt;2形变,150处2-gt;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.y+=dot(yMove,morph);

**

根据每个顶点对眼睛的距离来决定最后的形变值,可以保证只要顶点位置相同最后形变后的

位置也一定相同,避开了文献[1]中地形边界接缝等等麻烦的问题。注意在vs中计算morph为什么要用 saturate,是因为顶点缓冲中的 Pos.y是最高精度地形的高度值,比如要从1-gt;2级,除了要加上1-gt;2的形变高度值外,还要加上0-gt;1的高度差值,而且

2-gt;3,3-gt;4的形变高度值应该为0。上面这个式子正好能满足上面要求的情况。

处理完顶点形变后,还有一个工作要做就是要根据眼睛与地形块的最小距离来求地形块的

LOD,设置眼睛与地形块的最小距离为d,那么求地形lod的代码如下:if(dlt;MorphStart.y)//0-gt;1

lod=0;

elseif(dlt;MorphStart.z)//1-gt;2lod=1;

elseif(dlt;MorphStart.w)//2-gt;3lod=2;

elseif(dlt;MorphStart.w+50)//3-gt;4(50为最后一级形变的距离)

lod=3;else

lod=4;

现在似乎可以做到消除地形“跳动”的现像了,但是有一点还需要注意那就是光照。上面做的工作只是消除了几何形变产生的“跳动”,还有一个产生“跳动”感觉的是光照颜色,如果你是在vs内

文档评论(0)

hao187 + 关注
官方认证
内容提供者

该用户很懒,什么也没介绍

认证主体武汉豪锦宏商务信息咨询服务有限公司
IP属地上海
统一社会信用代码/组织机构代码
91420100MA4F3KHG8Q

1亿VIP精品文档

相关文档