前言
最近发现了之前自己鼓捣的blender的平滑着色和平直着色以及表面细分和最近刚学的渲染管线之间的联系,在此记录一下
一、平直着色与平滑着色
从字面意思就可以理解,一个是能直接分辨网格面的着色方式,一个是无法直接分辨网格面的着色方式
平直着色直接选取三角面上任意一个点,计算这个点的法向量和朝光源向量,将结果直接映射到这一三角面上的所有点(三角面任意法向量都相同)
平滑着色则是将平直着色计算得到的结果进行线性插值得到了一连串均匀变化的结果,反应在网格上就是一个光滑的面结果非常直观
有一个很有意思的现象是,当物体网格数量非常少时,平滑着色的效果就会非常差
有一种解决方法是将这个物体细分后再平滑着色
这种方法在网格面数比较低的时候既能光滑表面又能保留物体网格细节,一个更极端的例子是立方体
效果非常明显,这是由于平滑着色线性插值过程中由于网格面数过少带来的插值结果不准确,反映到模型上就是“丑”
当然在实际应用中,哪怕是右边的立方体也是无法真正使用的,因为他还是太“丑”了
二、表面细分
上面提到的丑产生的原因在于,阴影变化的十分不自然。结合平滑着色算法我们可以知道,这可能是由于边缘过度处光照变化大,但是网格面数仍然过少所带来的插值结果仍然不准确,那如果我们执行更多次的表面细分,结果就会更准确了
可以看到效果明显好了非常多,边缘处的过渡非常平滑,但这种操作方式有一个最大的弊端,面数太高了
光是一个立方体就有如此高的面数,这绝对是无法接受的
再从问题根源出发,既然我们只需要过渡的地方有足够的面来保证插值的准确性,那我们在所有边上进行多次倒角是否也可以达成效果
可以发现在执行了平滑着色后,我们同样得到了边缘过渡十分平滑的立方体,这样问题就完美解决了。
当然,为了得到更加完美的效果(如下图)
我们常常会在blender中使用表面细分修改器,,其实用的是catmull_clark算法,在这里就不多赘述了,大概意思就是将每一个面通过算法细分为多个面,来保证阴影变化的连续性,在这里同样涉及到了建模过程中的“卡线”,也就是为表面细分增加保护线,两个面的夹角约接近90°,细分后的结果越偏离真实结果,如图
立方体添加表面细分修改器后直接变成了一个球
而经过卡线后(这里采用的是倒角)上图分别说明了未倒角,1段倒角,2段倒角,3段倒角在3次细分算法之后的样子,这种时候再给复杂模型设置平滑着色效果则会好很多
总结
以上是本人对表面细分以及平滑着色的一些思考,如果有不对的地方还望批评指正