VoxelRendering(IdTech6's rendering)

2012/03/09 14:07
阅读数 111

siggraph08的一个文章:

http://s08.idav.ucdavis.edu/olick-current-and-next-generation-parallelism-in-games.pdf

siggraph09的一个文章:

http://artis.imag.fr/Publications/2009/CNLSE09/GigaVoxels_Siggraph09_Slides.pdf

 

相当hardcore,令人兴奋程度和crytek的light propagation volume相当。

 

这个目前看不到真正扎眼的feature,但是这个方向是令人激动的,如果id为首的一帮人真的能引领业界进入这个方向那是很赞。

 


 

什么是voxel?

可以对比texel来理解,在2D texture上的一个小单位,叫做一个texture。

引申到3D空间,一个小单位,小cube就是一个voxel。

 


 

现在的方式不是挺好的么,为何要用voxel rendering?

 

olick的文章认为voxel rendering会带来更好的游戏品质和更快的开发周期。

好处包括:

  • LOD和performance(某种程度上)会更好一些,id tech5给出的ps3 edge的数据是一帧(60fps的)会有80,000个三角形,但是%60会被cull掉,被cull掉的三角形就是无法贡献一个pixel的三角形。相比之下720p的buffer有大约90,000个pixel。pixel shader bound已经不像早期游戏那么明显了。这种情况下需要一种更强力的LOD机制来避免这种vertex计算的浪费。
  • 不再需要normal map,
  • 细节理论上无极限,
  • voxel 不只是包括position,还包括color,normal

个人觉得,voxel这个方向也适合复杂光照的计算,而且这种表达方式更加简单直接,会带来更多的优良算法的发挥。

 


 

voxel rendering一些内容

 

voxel被组织在稀疏八叉树里,也就是sparse voxel octree(SVO).

渲染的时候从pixel shader的每个pixel顺着camera方向cast一个ray出来,然后输出和octree相交node的index和depth。

这里还涉及到一个取octree哪一级的问题,做法和计算mipmap level的ddx和ddy比较类似,看比较远了或者和旁边的ray比较平行了就可以取大一级的voxel,否则就取更细节一些的level。

 

voxel里是小mesh,可以理解成把mesh离散化了,然后以voxel为单位存储和被sample。

mesh离散化可以看这个图示:

离散化之后,单位是最小的那个voxel,接下来要生成mipmap,就是更大一级的voxel里面要存储的小mesh。

最后一个mipmap一样的金字塔结构就构建出来了。

 

那么接下来就是要ray caster->sample voxel octree了。

 

 


 

voxel rendering pipeline

 

和megatexture一样,voxel rendering会涉及到巨量数据,需要频繁和硬盘交换页面。

基本pipeline:

 

 

这里面涉及到的东西可就多了,包括

  • 数据压缩
  • ray casting检测优化
  • 硬盘页面优化,cache优化

最后id给出的数据是runtime的52byte一个node,storage的8byte一个node。

遍历octree的时候也很多优化算法,cuda也上了。

 

dynamic geometry还是很有问题,目前不好弄,但是olick号称可以搞定,怎么弄没说。

 

开发时间,1年弄tools,3个月engine。

 

 


 

笔记到此为止吧,总之这个方向估计id不是提倡也不会太多人关注,id一说,起码我这种carmack粉丝立刻要研究一番。

也正像文中所说,这个是针对下代主机ps4这样的更强性能设计的算法,目前generation不太会有。

 

以后学习cuda的时候应该是个很好的练习对象。

 

 

 

 

 


原文链接: http://blog.csdn.net/ccanan/article/details/5137923
展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
在线直播报名
返回顶部
顶部