最近在研究树木的渲染,看了一些相关的技术说明,几乎都是老外写的,再次为中国游戏产业的前景感到担忧。看了几天的英文,索性也把其中的重要部分翻译了出来,在这里与大家共享,先贴出《GPU GEMS 3》第4章的翻译,第一次写翻译,不免有错漏的地方,欢迎大家指出。如需转载,请先与本人联系。name:LeYond ,qq:413952706
4.3.2 叠加阴影贴图
图4-15 照明比较
(a)预计算漫反射贴图 (b)逐像素阴影照明 (c)普通光照 (d)双面光照
4.4.2 镜面光照明
除了调节双面的照明,我们修改镜面光照,以提高其真实性。首先,在普通的镜面光照射下,远处的数目偏向微弱的闪光,所以我们随着距离的拉远而降低镜面光。下一步,我们我们注意到现实中的树叶有获取其他的光线。图4-16展示了一些经典的带有光泽的树叶,从这里我们总结出3点。镜面光反射是受控于树叶坐标轴的平面,它清晰地把镜面光划分开来.相对这些平面的效果,好的纹理细节和其他效果是微不足道的:镜面光不会有锋利边缘,因为他们有玻璃一样的材质。由于我们是对整棵树的构造感兴趣,而不是叶子的纹理,我们使用这些观察效果来简化我们的叶子镜面光照模型。要模仿轴的分离,我们使用一张更加粗糙的V形发现贴图,将叶子分开成两半。最后,因为太多的细节因为镜面光的加入而被闪光覆盖,我们偏移纹理在发现贴图中提取更低的Mipmap等级。结果将会更加平滑,也有更加温和的镜面光,而不会产生生硬的光照假象。
图4-16 此叶子照片展示了镜面光的现象
不幸的是,虽然提升了树叶的阴影质量,但没有从阴影贴图中去除其他场景。 在广阔的户外场景中,一张阴影贴图经常是不足够的。叠加阴影贴图(CSM)是解决这一问题的一种常见的技术,它通过把平截头体分解成若干个空间,并把每个区域渲染进不同的纹理当中。(关于CSM的描述可以查看Zhang et al. 2006。也可以查阅本书的第10章“在可编程GPUs上实现平行分割阴影贴图”获得更多相关技术。)
· 最靠近的栅格在每一帧都更新。所有属于它的物体都被渲染出来。
· 第二个级别的栅格是每两帧更新一次。大型植物没有渲染入阴影贴图。
· 第三个级别的栅格是每四帧更新一次。只有叶子才渲染进阴影贴图。
阴影贴图渲染之后,我们有许多方法在我们的3D世界种产生阴影:
1. 使用适当级别,在阴影贴图渲染物体时使用相同的命令。
2. 在每个层级中取出像素并混合它们。
3. 使用纹理数组并在像素着色器中选择适当的层级
4. 使用视口,将渲染目标分割为若干个阴影贴图。
每一种方法都有它自己的优点和缺点。在SpeedTree中,我们选择第二种设置。
4.4 叶子的光照
光照在观察者的感知中扮演着很重要的角色。SpeedTree的最新版本为树叶面板的逐像素动态光照提供了必要的数据,如切线和法线贴图。同时,SpeedTree的树叶面板能只使用预计算漫反射纹理。精细的光照和阴影能事先烘焙到漫反射纹理中。我们选择第一种解决方案,因为它支持全动态关照。
4.4.1. 双面光照
除了镜面光照,我们注意到,叶子的漫反射颜色取决于观察者跟太阳的位置关系。图4-13展现了两张叶子在不同的瞬间,在相同光照、相同曝光的设置条件下拍摄。(细心观察枯萎的褐色部分,你可以比较两张照片中的同一片树叶。一片用红色点标记。)当树叶背光时,大部分表现出是没有反射光;取而代之的是透过来的光。当光线穿过树叶,树叶的颜色会轻微第转向黄色或红色。
图4-13 试验观察方向的真实树叶光照
(a)树叶面光 (b)树叶背光
基于这种观察,我们已实施如下计划来模拟双面的自然照面。
· 黄色树叶颜色是在片段着色器中产生,float3向量各分量为(Diffuse.g * 0.9, Diffuse.g * 1.0, Diffuse.g * 0.2).
· 根据不同的μ—角度,如图4-14所示。是灯光方向向量和观察方向向量的夹角。
图4-14 背光中的叶子
取决于µ,镜面光成分会被削弱,因为背面没有光线会发生反射。这种做法可能看起来幼稚,但他让图片更加真实可信。如图4-15.