Gpu terrain
最近想研究下GPU对地形渲染的性能优化,google到了Gpu gems2的一篇文章: <Terrain Rendering Using GPU-Based Geometry Clipmaps>,链接: http://research.microsoft.com/en-us/um/people/hoppe/gpugcm.pdf,扫了一遍,看懂了大概,把要点记于此:
1. 以视点为中心渲染不同层级的矩形环状网格,每进一层网格密度增加一倍,取n = 2k−1作为每层网格的size,这样中心能恰好位于网格的分割线上,同时每层网格的中心都能偏离下一级网格的中心一个单位,方便后面较密网格层次的偏移计算,原话是:"it is necessary to allow a finer level to shift while its next-coarser level stays fixed, and therefore the finer level must sometimes be off-center with respect to the next-coarser level",关于这一点,我还没太搞明白
2. 创建一系列不同密度下的高度图,从最疏的高度图开始,执行一个UpSample的过程,细分高度,渲染下一级的高度图,这个过程发生在视点变化的时候,
3. 在VS中,根据指定的过渡区域大小确定一个alpha,对当前层级的高度和下一级密度的高度做一个插值,以使得不同密度下的网格能平滑过渡,这个过程要用到VTF(Vertex Texture Fetch ),需要shader Mode3.0的支持,同时可以把这个alpha传到PS继续进行不同层级的Normal map的混合计算
4. 矩形环可以分割为一个个小的block,这样可以减少需要的顶点数据量,同时也方便进行视锥裁减.
5. 可以只创建一个矩形环所需要的VertexBuffer,不同大小的矩形环在vs中进行偏移,缩放运算,由于都是相对坐标,因此可以使用D3DDECLTYPE_SHORT2来存贮坐标数据,一个顶点只需要4bytes
6. 在进行高度的插值时需要采样2个不同级别下的高度图,而VTF是一个相对比较耗时的操作,因此可以把当前高度和下一级别高度和当前高度的差压缩为一个浮点值编码到当前级别的高度图中去,整数部分存贮当前级别的高度值,小数部分存贮高度差,同样可以把相邻两个不同级别的Normal map压缩到一张四通道的Normal map中去,这个压缩的过程发生在UpSample时
7.设置纹理查找方式为wraparound addressing, 在更新地形时,实际上只是更新高度图和Normal map,我们可以把当前视点的位置映射到这些纹理,根据摄像机移动的范围构造出两个矩形区域进行更新,这一点可能不太容易明白
大概就这些,匆忙所记下的东西也许会有错误,如有TX发现请不吝指出
PS: 今天登录BLOG后发现有不少留言,大多已经是很早前的了,本人不写文章的时候很少登录博客,cppblog好像也没有方便的回复留言的功能,所以如 再有想与我交流的朋友请发邮件给我:[email protected]