今天大家在讨论GDC 2016中育碧在《彩虹六号(Rainbow Six Siege)》中所介绍的checkerboard rendering方法,认真看了看其中的实现原理,现在分享给大家,这里是原文链接。
跳过前面的Renderer Overview跟Material based DP System,这里直接进入checkerboard rendering框架(这个方案,Intel有专门的页面进行介绍,还提供了相应的源码,这里是原文传送)介绍。
《彩虹六号》的目标是实现60FPS,这里准备从GDC 2014分享的《Killzone Shadow Fall》中的interlaced rendering方案开始进行尝试。
这个方案的基本思路是将纵向分辨率缩减为原始分辨率的一半,之后通过修改投影矩阵(由于纵向覆盖范围维持不变,因此一个像素在纵向上覆盖的尺寸变为原始覆盖尺寸的两倍,之后单帧投影矩阵与双帧投影矩阵需要各自对应当前像素的前半个像素与后半个像素(也就是此前未降分辨率时奇像素与偶像素),因此需要通过投影矩阵添加半像素偏移)来实现奇偶帧结果的互补。
由于这里对投影矩阵进行了偏移与纵轴缩放,因此在处理梯度的时候需要做相应处理(其实这个还挺麻烦的,所有后处理中需要用到梯度计算的部分都要做处理)。
方案实施过程中遇到的问题,纵轴上的锯齿是一个大问题。
尝试通过checkerboard rendering来修复锯齿,最终发现这个方法比interlaced rendering有着更高的质量,且通过硬件MSAA 2X,可以不需要对渲染做太多修改即可实现。
从质量上来说,很显然checkerboard rendering要更胜一筹,下面看下具体方案。
checkerboard rendering的思路是,直接采用1/2 x 1/2分辨率进行渲染,之后通过MSAA + SV_SampleIndex之类的强制Separate Sample Shading(通常MSAA中只对pixel进行shading,将结果写入多个sample中,开启了SV_SampleIndex的渲染则会强制对每个sample执行一次shading,结果等同于SSAA(Super Sampling AA))方案实现半分辨率shading。那既然每个sample都渲染一次,这种做法相对于全分辨率不加MSAA渲染有什么优势呢?因为使用的是2x MSAA,因此相对于全分辨率渲染,计算次数还是少了一半,其消耗跟interlaced rendering类似,不过相对而言,具有更好的显示质量,更低的锯齿感。
这个就是checkerboard rendering的基本思路。
这里给出了checkerboard rendering的优势,说到不需要在shader中为梯度计算做特殊处理。
为什么不用呢,从输出结果来看,MSAA输出的raw buffer相邻像素都是空的,直接使用原始梯度计算方案肯定会得到错误结果才是。这里给出的说法是,通过LOD bias对像素添加一个偏移,就可以直接对下一个像素进行采样,通过这种做法就可以跳过相邻的空白像素数据,得到正常的梯度结果。
后面给出了checkerboard rendering的实施细节,这里就不再赘述了,有兴趣的同学自行翻阅吧。
网友评论