GPU 加速的静态 AO 烘焙

说明:这是我在公司的项目中实现的技术,日前写了篇用于培训讲解的 PPT,去掉了有关于地球安全机密的东西就放上来了。

GPU 加速的静态 AO 烘焙

简介

Ambient Occlusion (AO)

AO 是全局光照(GI)技术中重要的组成部分,AO 描述的是物体表面上点和场景中其他物体的遮挡值,在全局光照中使用 AO 来衰减光照到达表面的光照值。

计算 AO 的方法

以表面法线为中心向半球(或全球)方向发射 n 条射线,判断每一根射线是否相交,并计算表面点到相交点的距离作为 AO 权重,累加每条射线的 AO 值,作为当前表面点 AO 贡献值。将每个表面的 AO 数据存储在纹理中,我们称之为 AO Map。

XX的光照方案

XX采用静态光照和动态光照结合方式来渲染图形。在XX中,我们希望静态场景能体现 GI 的遮挡效果,所以需要在渲染场景时采样 AO 数据,在光照计算完成之后,采样 AO Map 乘以光照值得到最终效果。

静态 AO 生成的尝试之路

一开始我们采用的是 Beast 来烘焙 AO,但烘焙的性能和效果并不理想。最后我们采用 GPU 的方式来烘焙 AO 纹理,性能和效果都达到预期。

静态 AO 的生成

• Beast 全局光照解决方案

– 离线烘焙全局光照的解决方案

• 提供完整的 SDK

• 易于集成到游戏自己的内容创建工具中

• 多核烘焙支持

• 支持各种光照方式(Point\Dir\Spot\Windows\Area\Sky\Emmisive)

• 灵活的烘焙设定,单独设置烘焙内容,GI\AO\Shadow等

• 问题:烘焙太慢,一个XX的典型场景需要二十个小时。在XX上百个关卡的规模下难以满足要求。而且 Beast 目前还不支持分布式的 AO 烘焙。

GPU 加速的静态 AO 烘焙

• 我们采用 GPU 来加速 AO 的烘焙

• 工作原理:

– 模型上每个点发出的射线方向我们可以认为是相同的,这样以射线方向为视角,可以看做每个方向实际上就是以平行投影的方式渲染一次场景的深度,通过深度判定每个模型上每个点的是否被遮挡,得到当前方向模型表面的遮挡结果,依次循环每个方向,将每次计算的遮挡结果叠加起来,就形成最终的 AO 数据。

GPU 加速的静态 AO 烘焙实现

• 核心流程

clip_image002[1]

实现细节

• 生成球形的射线

– 这是非常重要的步骤,由于要求生成的射线是均匀分布在球面上,否则烘焙的效果很差。所以我们采用的是球谐光照中生成均匀分布的球形射线的方法。根据测试发现,900根射线是性价比较合适的值。

• 渲染深度图

– 因为我们假设物体所有表面上的点发出的 AO 射线方向是同一方向,所以这个步骤必须将投影矩阵设置为平行投影方式,可以根据渲染物体的包围盒生成投影矩阵。

• 计算 AO 值

– 得到深度以后,采用和 Shadow Mapping 一样机制计算物体表面的 AO 信息。这一步需要注意的是生成的方式,将需要生成 AO 的模型渲染到指定大小的 AO Map 的 RT 上,由于 AO Map 保存的是物体上每一个点的 AO 值,所以 AO Map 纹素对应物体上每个点。可以利用 Light Map UV 坐标不重复的特性来生成对应关系,在 VS 阶段将 Light Map UV 作为变换后的顶点位置输出给渲染管线,在 PS 中使用 VS 传入的世界空间位置计算 Shadow,就做到了和模型顶点一一对应了。

• AO 修正

– 和 Light Map 同样存在的问题就是纹理像素的溢出,这需要扩充有效像素缓解这个问题,将得到的 AO 纹理直接渲染到相同大小的 RT 中,在 PS 中对判断当前像素是否无效,如果无效则采样周围 8 个像素,统计并累加其中的有效像素,得到有效像素的平均值,作为当前像素的颜色值,并设置当前像素为有效。如此迭代每个纹素,这样就对 AO Map扩展了1个有效像素,如果不够还可以再做几次,直到结果理想为止。

效果图

clip_image004[1]clip_image006[1]clip_image008[1]

clip_image010[1]clip_image012[1]clip_image014[1]

性能对比

• 测试场景烘焙对比

– Beast: 45分钟

– GPU:2分钟

未来的改进

• 性能:

– 每个物件都要渲染一遍场景深度,对相邻的物体来说,由于位置很接近,深度信息其实可以共享,所以可以考虑一次处理多个相邻的物体,以提高烘焙的速度。

• 质量:

– 可以对生成的结果在进行高斯模糊过滤,产生更加平滑的 AO 效果。

参考资料

• Spherical Harmonic Lighting:The Gritty Details

Advertisements
此条目发表在Uncategorized分类目录。将固定链接加入收藏夹。

One Response to GPU 加速的静态 AO 烘焙

  1. 说道:

    这个必须顶一下,这个是美术制作人员的福音啊!

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  更改 )

Google+ photo

You are commenting using your Google+ account. Log Out /  更改 )

Twitter picture

You are commenting using your Twitter account. Log Out /  更改 )

Facebook photo

You are commenting using your Facebook account. Log Out /  更改 )

w

Connecting to %s