天天看点

[GPUPro4]PracticalPlanarReflectionUsingCubemapsAndImageProxies

[GPUPro4]PracticalPlanarReflectionUsingCubemapsAndImageProxies

<RememberMe>里面使用的用于反射的技术,实战的文章,非常不错。

文章本身很不错的,总结了不少反射用的技术,包括:

  • 简单的cubemap(envmap)这个常常有parallax(视差)问题
  • screen space reflection
  • real time ray tracing : 当然是比较简化版的,举的例子是UE的SamaritanDemo

在吸收了各家之长的基础上,提出了自己的想法,主要是两点: 矫正过的env mapping:

[GPUPro4]PracticalPlanarReflectionUsingCubemapsAndImageProxies

最左边的那个图里的方法就是最粗暴的texCube(envmap, dir)这种做法,对的差了远了去了。

然后是矫正过得做法,

[GPUPro4]PracticalPlanarReflectionUsingCubemapsAndImageProxies

从图里一目了然,就是反射到的一个点,投回envmap所在的空间,计算出方向,然后sample,这样就准确了,很赞。

ImageProxy 可以理解为Billboard,Imposter,其实都是一个意思 ,就是把模型渲染到一个小render target里面,然后拿来使用,这样在reflect的时候,就很节省。 ImageProxy用于静态capture的cubemap hold不住的情况,人物,精度不足的情况等等。

工具&Detail 上面说的都是基本的思路,工程中不会这么简单了

  • [GPUPro4]PracticalPlanarReflectionUsingCubemapsAndImageProxies
    • envmap的覆盖区域和反射平面是定义好的
  • 在角色身上有一些小技巧,可以使用一些quad挂在骨骼上,然后使用animation来更新这些quad,然后render出来,和人物本身的样子和动画大体符合,也能蒙混一下(阴险啊)
    • [GPUPro4]PracticalPlanarReflectionUsingCubemapsAndImageProxies

LocalImageBasedLighting 通俗说就是:这个就是EnvMap使用到比较光滑的物体上,金属物体有环境反射的那个感觉,采集的EnvMap是空间里预先放好的一个个小球(Probe),在金属物体位置发生变化的时候,在不同EnvMap之间插值切换。 刚好上一篇的Killzone4的文章也提到了,使用了之后,结合glossy reflection可以有效的达成很棒的secondary specular lighting,《remember me》在多个EnvMapProbe之间的切换的时候,blending weight美术是可以自己来定义的,这样效果有时候就是需要人为干预一下。

性能 一般场景里面是2个cubemap,10到15个image proxy。 ps3上面是0.17ms的贴图生成时间+0.16ms的mipmap生成时间 xbox360上面是0.1ms的贴图生成时间+0.009的mipmap生成时间。 应该说效率非常可以了。