siggraph09, black rock studio在《pure》&<split/second>中的渲染技术介绍:
这篇文章的含金量颇让我吃惊,短小强悍。
---------------------------------
ground cover render in pure
使用交叉摆放的sprite来render大量的草。
使用density map来放置草,有tile cache(camera移动的时候就不用完全重建),render的时候就是sprite。
---------------------------------
tree rendering
树的渲染中比较有挑战的是叶子的反锯齿,alpha test和alpha to coverage都不够好。
black rock是使用
- 画alpha mask的时候输出color和alpha
- color使用add作为blend op
- alpha使用max作为blend op
- shader里最后画tree的时候,把color.r和alpha做一个平均,然后blend
- 这样就可以得到特别好的aa的结果
- 同时因为有alpha mask,也不用担心排序的问题
----------
render in split/second
deferred lighting, g buffer format:
1 | Albedo.r | Albedo .b | Albedo.g | Unlit.r |
2 | Normal.x | Normal.y | Normal.z | Unlit.b & Edge |
3 | Unlit.g | Specular | Motion.x | Motion.y |
shadow:
- screen space shadow map
- pcf
- 使用shadow edge mask来把需要pcf处理的地方划出来,只对这个部分来做pcf,这个对效率又不错的提升:
- 使用downsample的方式来划出来pcf需要做的区域,效率差距:
-
Without mask
6.4ms
With mask
1.7ms
Calc mask
0.6ms
irradiance volume:
像light propagation volume一样,把sh系数存到volume texture里,在deferred renderer中去sample sh,来做indirect lighting:cool。
在link1中继续细致的讲解。
- cook time:
- 使用octree来做场景划分
- 最大的划分单位是一个streaming sector
- 如果一个grid里面有geometry,就继续划分,到一个指定的最小值为止
- runtime:
- irradiance volume数据以sector来store和streaming
- 使用64*64*16的volume texture
- 存的方式不是sh,而是ambient cube,这里有一个表:
- 我们可以看出,ambient cube是一个介于order1和order2之间的一个存储量
- 每帧去更新volume texture,有cache,搞好的部分就不更新了,计算的时候会根据变化重新计算偏移
- 从下图我们可以看见,volume texture lookup是非常昂贵的,quarter buffer一个比较合适的选择
- 2m的resolution对于volume tex来说比较合适的(对于split/second来说)
- split/second还尝试了使用non uniform volume texture,这样就有了一个lod的概念,但是这样就给cache的update带来问题,最后被弃用
- 当然irradiance volume最棒的地方就是提供了real time indirect lighting的可能性