游戏开发论坛

 找回密码
 立即注册
搜索
查看: 15100|回复: 8

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

[复制链接]

1

主题

1

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2007-4-26 11:14:00 | 显示全部楼层 |阅读模式
   在地形渲染中为了减轻渲染负担其中一个技术是就LOD,但其带了的一个问题就是会产生地形”跳动”,因为地形的LOD精度发生变化时镶嵌的密度也发生了变化。要解决这个问题有一个方法就是当高精的模型向底精模型变化时不是突然变化过去的,而是慢慢渐变而来,这样可以极大的减少”跳动”。通过设置适当的渐变距离可以做到让观察者感觉不到地形的变化。

   关于这个问题在一篇文章里面也有介绍:Terrain Geomorphing in the Vertex Shader[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。这样我们可以把四种形变的高度值存到一个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内计算形变高度值了,在计算之前还需要传入两个参数:
float4 MorphStart, 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中计算高度值的代码如下:
void vsMain(  in float3 Pos   : POSITION0,
           in float4 yMove : POSITION1 )
{
      float viewDist = length(Eye - Pos );
      float4 moprh   = saturate( (viewDist-MorphStart)*MorphInvRange );
      Pos.y         += dot( yMove, morph );
}
   根据每个顶点对眼睛的距离来决定最后的形变值,可以保证只要顶点位置相同最后形变后的位置也一定相同,避开了文献[1]中地形边界接缝等等麻烦的问题。注意在vs中计算morph为什么要用saturate,是因为顶点缓冲中的Pos.y是最高精度地形的高度值,比如要从1->2级,除了要加上1->2的形变高度值外,还要加上0->1的高度差值, 而且2->3, 3->4的形变高度值应该为0。上面这个式子正好能满足上面要求的情况。

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

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

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2007-4-26 13:42:00 | 显示全部楼层

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

好文章。。。先消化消化。

154

主题

4567

帖子

4579

积分

论坛元老

Rank: 8Rank: 8

积分
4579
QQ
发表于 2007-4-27 11:28:00 | 显示全部楼层

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

飘过,貌似是一个分步过程,加入了对距离的筛选

75

主题

385

帖子

400

积分

中级会员

Rank: 3Rank: 3

积分
400
发表于 2007-7-19 14:51:00 | 显示全部楼层

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

能具体点最好

2

主题

41

帖子

47

积分

注册会员

Rank: 2

积分
47
发表于 2009-4-13 18:10:00 | 显示全部楼层

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

连光影也要去渐变lod.有这个必要么,玩家看到那跳一下会死啊,牺牲太大了,等大家的机器最少是支持DX10的时候,用Geometry Shader 里完成算了

201

主题

1437

帖子

1963

积分

金牌会员

Rank: 6Rank: 6

积分
1963
QQ
发表于 2009-4-15 15:22:00 | 显示全部楼层

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

对高精度的地形块进行形变来模拟低精度的地形块, 当高精地形和低精地形的形态完全一样时,地形块的LOD才变为低精度的。

挺好:-)。

0

主题

24

帖子

43

积分

注册会员

Rank: 2

积分
43
发表于 2009-4-17 08:21:00 | 显示全部楼层

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

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

连光影也要去渐变lod.有这个必要么,玩家看到那跳一下会死啊,牺牲太大了,等大家的机器最少是支持DX10的时候,用Geometry Shader 里完成算了

对性能的考虑当然是对的,但是,我觉得这样的想法不太好。总是要尽量提升体验的么

3

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2009-8-13 13:33:00 | 显示全部楼层

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

直接加点雾化不就看不出来了么。。

13

主题

312

帖子

312

积分

中级会员

Rank: 3Rank: 3

积分
312
发表于 2009-8-13 17:30:00 | 显示全部楼层

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

写的不错 :〉

如果是DX10/11,可以通过Tessellation来实现高细节的Terrain LOD,而不需要任何CPU的参与~~楼主有兴趣可以研究下,不过DX10的GS很慢的,可以直接考虑DX11,专门为TS做了优化~不过就是有限制,只能子分到64~


.


------------------------------------------------------------------------------------------------
欢迎访问 http://www.opengpu.org/bbs/

OpenGPU图形开源社区,聚焦各种GPU Architecture(图形处理器体系结构)以及各种Graphics Algorithm(图形算法),Open Source Rendering Engine(开源渲染器)、Open Source GPU Simulator/RTL Implement(开源GPU模拟器)的项目,欢迎访问
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-21 08:35

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表