[gpu pro2]LargeScaleTerrainRenderingForOutdoorGames

同事提及这个文章,果然很不错,讲地形渲染的一个比较有新意和实用性。

geometry

地形的uv使用uv relaxing,也就是会随着地形的变高进行uv伸展,这样通过在uv上的变化来处理拉伸情况。

这个的确是可以节省不少计算

material

  • 每个像素点只能2层材质混合
  • 使用dxt5的alpha通道记录一个index值,index值不完全是一个整数,可以是代表2.5这样的数,就代表是第二个material和第三个material。
  • 把多张material pack到一个大的texture里面,也就是atlas的方法,然后使用index信息,读取两个(最多)材质的信息,然后混合
    • 这里处理使用linear filter sample atlas贴图的时候有一些需要注意的地方,在下面说到了
  • [good]每个像素点的读取贴图的数量,对比常规的material mask的多层贴图sample,要少不少
  • [bad]
    • 不像常规做法,某个像素点可以有多层混合的情况
    • 由于只能是邻近的两个tile进行混合,所以如果混合的情况比较复杂,就需要repeat sub texture,导致atlas的利用率不那么高,进而限制材质的种类
    • atlas里面的贴图需要同一个resolution的,某些情况就是需要更大的resolution,这个也造成了问题
texture atlas sampling

这里面关于atlas sample的部分挺不错
  • atlas的mipmap生成需要做一些处理,也就是不要默认的通过linear filter这样去生成mipmap而是每一个部分的mipmap生成好再合成一个大的atlas,在mipmap低到一定程度的时候,就不要生成mipmap了,否则就不得不出现多个sub texture合并的情况了
  • sampling的时候和其他的一样,通过限制uv的方法来避免linear filter取到其他subtexture的情况
    • 但是这种会导致在边缘处,ddx,ddy特别大,进而总是取到mip0的情况,这种情况的处理就是自己手动来计算mipmap,然后使用tex2dlod来自己指定mip
      • [gpu pro2]LargeScaleTerrainRenderingForOutdoorGames_第1张图片
    • 其他无需多言,直接代码吧
    • [gpu pro2]LargeScaleTerrainRenderingForOutdoorGames_第2张图片
    • [gpu pro2]LargeScaleTerrainRenderingForOutdoorGames_第3张图片
效率:
在xbox360上面,一共消耗了14mb来存10km的地图,渲染时间大约6ms。
也做了一些block的划分,避免不得不使用u32的index,同时也便于kdtree的management


你可能感兴趣的:([gpu pro2]LargeScaleTerrainRenderingForOutdoorGames)