欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

[gpu pro]《正当防卫2》渲染技术

程序员文章站 2022-04-24 17:50:01
...

humus写在gpu pro上面的,其中很多东西在他的网站上,以及后来的siggraph12上面提及了,文章链接 雷同的地方就不记录了,结合siggraph12上面的那个文章,可以说含金量颇高,有较多可以借鉴的亮点。 light index 多光源的处理方法不是deferred系列,而是使用l

humus写在gpu pro上面的,其中很多东西在他的网站上,以及后来的siggraph12上面提及了,文章链接

雷同的地方就不记录了,结合siggraph12上面的那个文章,可以说含金量颇高,有较多可以借鉴的亮点。


light index

多光源的处理方法不是deferred系列,而是使用light index的方式,把light信息放到一个texture里面。

细节就略过了。

shadow

使用了cascaded shadow map,有snapping避免抖动,在camera处于不同情况下会自动的调节shadow的range来最大化利用率。

这里一个细节很棒,在不同cascade之间过渡的时候,使用的是dither,而不是blend,这样就避免了sample两次的问题。

[gpu pro]《正当防卫2》渲染技术

在pc还实现了一个类似pcss的效果,是使用类似ssao的方法,在shadowmap里面进行sample搜索,根据有没有occluder来决定shadow kernel的大小。

人物的shadow

justcause2的游戏情况是常常是人物就在镜头前,这个造成正常的shadow的效果精度不足,humus他们尝试了增加一个专门的渲染人物的shadow buffer,但是发现性价比过低。最后采用的是tatarchuk的light bleed mapping technique。

这个参考文章是这个:http://developer.amd.com/wordpress/media/2012/10/D3DTutorial05_Real-Time_Skin_Rendering.pdf

05年gdc一个文章,当年应该说颇具前沿的,现在看来也挺有理论深度的,不过基本上是不适用了,图形学变化真是快速。

light bleeding就是把shadow计算做一些扩展,根据receiver和occluder的距离,不再是简单的可见不可见,而是逐渐的亮度递减:

light bleeding的函数图:

[gpu pro]《正当防卫2》渲染技术

正常shadow的函数图:

[gpu pro]《正当防卫2》渲染技术

humus做了些变化,natalya是使用的exp衰减,而justcause2里面是使用的线性衰减。

最后character部分的阴影就更加的柔和(visual artifact更少),算是不求有功但求无过的做法了。

ao

有这么几种ao:

  • 物件上材质带的ao,material里面带一个ao的通道
  • ssao
  • ao volume:在character,车辆上面常常有

floating point precision

在另外一篇博客里面有了,就不重复了,这里稍微记录下floating point的精度大小怎么去计算,这个涉及到floating point的原理,这个原理用到的几率非常之低,所以忘记了应该说挺正常的。

我们一般的floating point是23位的mantissa,所以如果我们在8192这个级别做计算,那么精度就是8192/pow(2,23)=1/1024,大约是毫米级别,但是在矩阵做了各种旋转类的操作之后,误差积累是惊人的,做法就是先做translation,避免掉大数据,然后再做rotation。

一致的api

跨平台的常用做法就是自己engine里面有一个api,处理各种平台,这个在设计的时候humus表示如果能更早的借鉴dx10的state object设计上会更精简一些。

dx10之后就是把state做了分组,blend state等等,这样的设计就是更精炼。

gamma

justcause2里面使用linear space做lighting,但是有一些硬件在dx9的srgb上面的blending有一些问题这个带来一些困扰。

然后一个问题不是那么技术,但是导致的问题却非常多,就是早期程序员使用了2作为gamma转换的值,而不是2.2,这个对于程序员来说看不出什么区别,但是对于artist这个区别就大了去了,最后改正带来一些代价。

memory优化

首先justcause使用了一个不错的给artist&designer的反馈就是,在memory耗尽的时候,就不再分配新的贴图出来,而是使用一个错误贴图来警示,然后迫使designer来做资源缩减,这个就是项目中技术含量虽然不高,但是非常有效的一个手段。

shdow map使用16bit,1024分辨率,3张。

vertex compress

做了一个进一步的texture packing,在一些允许的情况下,把texture的颜色放到vertex上面,texture里面只保留luminance,然后3张压到1张dxt1里面。