当前位置: 代码迷 >> 综合 >> GPU Gems 2 二:使用基于GPU剪切图的地形渲染
  详细解决方案

GPU Gems 2 二:使用基于GPU剪切图的地形渲染

热度:54   发布时间:2023-11-21 16:08:19.0

2.1 几何剪切图简介

要渲染整个地形的细节非常困难,比如吃鸡,从高空中落下,如果在最高处就渲染一块完整的地形,很显然是非常浪费时间和性能的。

几何剪切图:顾名思义就是把地形剪切掉了,但是并不是不渲染,而是模糊的渲染,比如从高空中落下,每下降1000米为一个阶段,地形就会刷新一遍,这里用2D的高程图来代表地形的渲染。

从高到低,每一个阶段都有一个n*n的剪切图,来代表当前阶段的地形图,每个剪切图都是一个环状的,中间的不用渲染是因为上个阶段已经渲染过了。

 它的难点在于怎样在不同的阶段之间形成平滑的过渡,方案之一就是在剪切图的外围保持一个环状的过渡区域,这个区域线性插值,过渡在顶点着色器和像素着色器中实现。

2.2 GPU 实现概览

现在的剪切图是存储在一张2D 纹理中,CPU只参与把数据解压,传递到显存里面,剩下的都有GPU操作。

每一层的剪切图都有n*n个栅格,每个栅格的(x,y,z)坐标,xy 为顶点坐标数据,z 是一个单通道的高程图纹理,获取高程图,就是对高程图采样,这里面用到的数据结构就是顶点缓存、索引缓冲区,一个单通道的高程纹理,4通道每通道8位的法线纹理,用来计算光照。

剪切图的大小要比2的n次幂小,因为硬件会对其进行优化,避免影响数据,大部分选择n=255,同时精细的剪切图不完全和粗糙的剪切图中心对齐,允许摄像机的移动,让最终的结果更具复杂感。

2.3 渲染

视锥裁剪,以块为基准,和视锥体相交的渲染,裁剪掉不相交的

然后用兰伯特光照模型进行着色,这里面重要的是把相邻两层的高程采样点压缩到一个float寄存器里面,分小数和整数存储,在像素着色器中根据这个来进行颜色的差值,同时在像素着色器中的相邻两层的法线值,存储到一个float4 里面,注意要进行重新归一化,同时要映射到[-1,1]之间,因为采样得到的法线值在[0-1]之间。

2.4 更新

当在某一个剪切层上平移时,需要动态的更新剪切层的内容,因为其中心一般不用更新,所以需要更新的大概就是一个L的范围。更新顺序是从粗糙层到精细层

 这个更新会在像素着色器中进行,我们的目的就是得到精细模型和粗糙模型的高程差,从而对两者混合。精细层的高程值,是根据粗糙层的值进行升采样得到的。就是对粗糙层采样然后加上一个残差,残差存储在噪声纹理中,能够让地形更随机。