Unity Shader - Flat, Gouraud, Phong Shading

Shading mode

Flat shading(平面着色)

只要三角面的代表点(如:三角面中的第一个index点)被光照到什么颜色,就决定了该三角面的整个面的颜色。

某特殊情况,大家应该可以想象到:

  • 如果一个很大的三角面中,第一个index点一个聚光灯照到,那么整个大三角面绘制出来的就是光源色
  • 如果一个很大的三角面中,几乎被一个聚光灯照射到整个面,但就没照射到代表点(第一个index点),那么整个大三角面绘制出来的光源色就没有这个聚光灯的光源色

Gouraud shading(高洛德着色)

与Flat相比,仅仅是三角面所有像素颜色是根据三个顶点的光源色插值算出来的,所以上述Flat shading的某特殊情况,Gouraud shading也有类似的问题(顶点没被关照到时的颜色问题)

Phong shading(冯氏着色)

相比前两者的shading mode,该模式处理光照数据是在fragment阶段处理的,所以能精确控制到每个像素上,当然开销就比较大,像素处理光照时,每个像素的所在的三角面计算光照时的法线都会根据插值计算一下(根据三角面三顶点插值),所以每个像素处理出来的光照效果是最平滑的,这就与光照到底有没照射到顶点上没关系了。

总结

  • Flat, Gouraud shading 都是在vertex阶段处理光照数据的
  • Phong shading是在fragment阶段处理光照数据的

所以如果我们用到了这三种光源处理shading,就按我们需要的风格来选择。

测试用例

  • 工程下载(u3d ver : 2017.4.3f1, vs : vs2017_community)
    • 使用Unity打开工程,打开Assets/Scenes下的场景,运行即可
    • 工程中相关的一些知识点:
      • 顶点共享、不共享的优劣
        • 前者内存少些,但顶点数据不就够丰富,如:法线共享了的话,在一些不同平面中共享了顶点法线那么不同面的法线都会与此共享顶点相关
        • 后者就没有以上的情况了,但就内存增加了
      • U3D中的默认正、反面:当一个三角面在相对投影坐标下,三个顶点的连接顺序是按顺时针的话就是正面,反之反面
        • 当然正反面根据顺时针还是逆时针来定都是可以设置的(但U3D我现在还不熟悉,不知道哪里可以设置)
  • 运行效果
    Flat, Gouraud, Phong Shading

参考

如何在Unity中分别实现Flat Shading(平面着色)、Gouraud Shading(高洛德着色)、Phong Shading(冯氏着色)

猜你喜欢

转载自blog.csdn.net/linjf520/article/details/81200570
今日推荐