OpenGL开启Gouraud明暗处理,减少马赫夫效应

在我们建立三维模型的过程中,当用多边形网格或者是三角面片来近似的表示曲面的表面时,曲面被离散成许多的平面多边形,如果我们的网格较大,离散度较粗,在模型表面使用明暗处理后,两两相邻的多边形会出现凸起或者是凹陷的折痕,在连接处显得比周围处亮或者暗,这就是所谓的马赫夫效应,如下图所示

针对于出现的马赫夫效应,我们需要进行明暗处理,消除或者是减少三维模型的马赫夫效应,使其看上去更加的光滑美观,常用的明暗处理技术有双线性光强插值—Gouraud明暗处理技术和双线性法向插值-Phong明暗处理技术。以下展示经过明暗处理前后结果对比


OpenGL提供了两种着色模式void glShadeModel ( GLenum mode),恒定着色GL_FLAT,光滑着色GL_SMOOTH,而GL_SMOOTH中则是使用了Gouraud明暗处理技术,对于Phong明暗处理技术可以参见http://blog.csdn.net/dalewzm/article/details/46291397

http://blog.csdn.net/silangquan/article/details/10011169


Gouraud明暗处理算法在处理亮度的不连续性方面很有效,但是在明暗强度函数的斜率急剧变化处仍然可以看到马赫夫效应,不能完全消除光强度的不连续性。而Phong明暗处理是对表面的法向量而不是亮度进行插值,大大改善了Gouraud模型对高亮度镜面反射光的处理,在每一点都是用法向量的一个近似值,所以一般法向量插值的结果要优于亮度插值,在很大程度上消除了马赫夫效应,但是会大大增加明暗处理的时间。


鉴于此,我在用MC算法建立三维模型的时候,由于我的网格设置较大,导致出现了马赫夫效应,即模型表面的可视化效果不光滑,如下:


于是使用OpenGL自带的Gouraud明暗处理技术,以一个MC算法生成的章鱼模型为例子,效果如下


相比未使用明暗处理的模型,使用了Gouraud处理的模型从可视化的角度上来看更加的光滑,效果更好。