这个案例是一个大杂烩,它把很多常用的操作以单独模块的形式进行组装以实现一定的效果。这里面最重要的是所有的这些技术都是后处理技术,也就是在正常渲染完成后对生成的场景帧(或者说纹理,图片)进行加工处理。Post Process与以往案例最大的不同在于将物体的几何信息分别存贮在不同的渲染表面中。这样做的好处,在后处理中仍然能得到需要各种的信息。另外后处理的一个强大之处在于,当场景有多个或多种灯光时,我们不用对物体一一采用各种光照模型,因为很多像素对应的fragment(将要写入这个像素的某个物体小碎片)很多,而只有一个fragment最终写入到这个像素,这样绝大多数fragment的光照计算都被浪费的,而如果将光照处理放到最后,再对这些存有物体各种信息的表面进行处理,就可以实现延迟着色技术(deferred shading)了,让所有像素只进行一个光照计算。
这个案例另外一个特色就是构建一个独立完整effect框架,以使得多个effect可以自由组合。不过这和我们要学习图形特效关联不大,主要是逻辑处理和结构调整的问题。我为了写一个和案例不同的小框架也耗费了1天的时间。
由于很多技术在先前的案例中已经学习了,这个案例中只有小部分特效让我有些特会。但没想到都是那么几行代码,却解决了很大的问题。
- 边识别(Edge Detection)。案例中介绍了两种方法,一种颜色识别,一种是法向量识别。理念是相同的,通过比较待处理的像素与其周边的差别并将差别累计,将差别大的涂成白色,将差别小的涂成黑色,这样我们就能看到轮廓了。其中向量法是通过将计算待处理像素的法向量与其相邻四个像素的法向量夹角的cos值,来得到像素之间的差别。而颜色识别就是比较颜色了。我个人觉得法向量很是不错。
- DOF的另一种实现方法,在以前的DOF中采用模糊图案进行模糊处理。而这个sample中则采用了模糊图片进行模糊处理。通过先原图片进行模糊化得到一个模糊图片,然后计算每个像素的模糊因子,用这个模糊因子在原图片和模糊图片中进行线性差值得到最终颜色。
另外在这种图片处理技术中经常用到XYZRHW格式的顶点,对这种四边形的处理就想是指定原矩形(在纹理图片中的)和目标矩形(渲染目标体)一样。其四边形的空间坐标是目标矩形,其纹理坐标是原矩形。这点在这个案例中得到体现。如果一个effect对图像进行缩小(但仍在原来的表面,即表面大小没变),那么我们只需要改变纹理坐标,这样下一个effect处理纹时,就像在处理一个单独完整的纹理一样。
具体的程序细节还是比较清楚的,这里就不多说了。另外一个经验之谈就是,图形的处理具有调节性,公式不是一成不变,添加一点小“作料”,“味道”就可能会不同。能调出好“味道“的公式,就是好公式。