[sig07][dice]Terrain Rendering in Frostbite using Procedural Shader Splatting

[sig07][dice]Terrain Rendering in Frostbite using Procedural Shader Splatting

link:

http://developer.amd.com/media/gpu_assets/Andersson-TerrainRendering(Siggraph07).pdf

http://citeseerx.ist.psu.edu/viewdoc/download;jsessionid=E186596C09CC8E696BD79A02DBA080CC?doi=10.1.1.161.8979&rep=rep1&type=pdf

dice的主力 johan Andersson带来的一个关于terrain render 一个文章。

 

地形一般是有低精度的,unique的color map和高精度的tiling的detail map组成。

 

 

这文章的时候是在battlefield2之后了,dice表示对bf2的地形(traditional terrain)很不爽,要来点给力的。

这里讲的估计也是battlefield3的吧。

 

  • 高精度texture做heightmap,16bit的
  • vertex shader texture生成高度
  • shader calculated normal

使用了procedural技术来生成texture(当然不是所有的texture),比如slope area的texture就有procedure技术的:

  • height 
  • slope
  • normal

为参数。

 

slope terrain部分毕竟是比较特殊,所以使用mask来区别那里是有slope的(mask也可以做别的)。

slope的mask也可以在shader里面计算出来。

 

管理sparse mask texture

每个material一个mask texture来存储。

把mask texture有用的部分按照32x32存到一个个patch里面,把这些patch再atlas到一个大的texture里。

因为大部分情况一个material在terrain上使用率是比较低的,所以这是一个big win。


有一个index texture来存某一个地方使用了那一个的mask patch。

这样在shader里面就先sample index texture,然后根据sample出来的index来取texture mask patch。

 

material mask

用来保存很多信息,这个每个engine可以根据自己需求来定义,dice是做一些比如slope area, undergrowth等标识。

而且也不用担心太多,mask一般就占所有的%5--%15,非常可以接受。

而且可以对这种情况做一些优化,使用sparse quadtree texture来存储,将texture切成tile(32x32),然后atlas。

 

 

quadtree来管理,但这个只是当时的解决方案,后来的方案是grid+multithreading:link

 

lod之间是用t-junction,这个算法只需一图:

[sig07][dice]Terrain Rendering in Frostbite using Procedural Shader Splatting

 

 

 

undergrowth

  • instancing
  • procedural on demand----只是存一些描述,然后生成
  • 按照16*16这样的virtual cell为单位(terrain是32*32)来管理

 

 

小结

 

可以说整个部分的亮点是procedure技术,这个的确是趋势所在:

  • 更加灵活的lod,in game的lod控制或是不同机器配置都可以做的更好
  • 对存需求小
  • realtime的耗时可能多可能少,因为现在越来越多的bottleneck在内存上,降低内存消耗的往往也能降低时耗

 


原文链接: http://blog.csdn.net/ccanan/article/details/6321116

你可能感兴趣的:([sig07][dice]Terrain Rendering in Frostbite using Procedural Shader Splatting)