Shading Frequencies 着色频率
- Flat Shading 逐平面着色
- Gouraud shading 逐顶点着色
- Phong shading 逐像素着色
Blinn-Phong Reflectance 模型解决了如何对一个着色点进行着色,着色频率定义了该选择哪些着色点进行着色
Flat Shading 逐平面着色
- 利用三角形面的法向量进行着色操作,将着色结果作用于整个三角形面。
- 每个三角形的面颜色一致,着色效果在三角面数少时不平滑,效果不理想。
Gouraud shading 逐顶点着色
- 对每个三角形的顶点进行着色
- 需要计算顶点的法向量,后续会介绍
- 然后三角形内部通过重心坐标系插值的方式进行着色
- 后续会详细介绍重心坐标系插值
- 这种对平面顶点的操作计算量相较直接对平面着色较大,但三角形内部可以通过插值产生渐变的平滑效果,效果更优。
Phong shading 逐像素着色
- 每个像素点都作为着色点,进行一次Blinn-Phong着色。
三种着色频率的适用性
- 横轴是三个着色频率,纵轴越向下模型的面数越多
- 可以看出当模型的面数足够多,Face Flat的效果也不输于其它两种着色频率。
- 实际应用时,应根据模型精度辩证的选择着色频率
逐顶点着色问题
计算顶点的法向量
- 第一种方法,一些明确的模型,例如球体,每个顶点法向量都是明确给出的,即球心与其连线向外。
- 第二种方法:近似的获取顶点的法向量,对周围三角形面的法向量进行加权平均计算,面积大的三角形所占权重更大。
三角形插值 Interpolation Across Triangles
插值的意义
根据三角形顶点的特殊值,获取平滑的值作用于三角形内部其它的点。
插值的属性
在三角形顶点可以存储各种各样的属性信息,颜色,纹理等等,都可以通过插值平滑的作用于三角形内部的每个点。
- Textrue coordinates 纹理映射坐标(x,y,z)
- 空间中的每个着色点对应使用纹理中的哪个坐标下的纹理。
- Colors 颜色值 (r,g,b)
- normal vectors 法线向量
- 以上是常用的几种插值属性,根据需求还可以在纹理中定义诸如相对变化高度等制作凹凸贴图效果等等,根据需求而定。
三角形的重心坐标系
定义
- 重心坐标看似三个α β γ变量 实则由于限制条件的存在,知道2者就可得到坐标,这是有意义的,二维坐标本身就不应该有三个变量。
- 如果三者相加不等于1,就说明此点就不在三角形的平面内
- 判断点是否在三角形内 : α > 0 且 β > 0 且 γ > 0则说明点在三角形的内部
- A的重心坐标根据公式就应该是(1,0,0) B:(0,1,0) C:(0,0,1)
重心坐标系公式
-
利用面积比求任意点(x,y)的重心坐标
-
重心坐标的通用公式
重心坐标系的插值
重心坐标系的插值,就是将任意点(α,β,γ),三个坐标值分别乘以三个顶点需要插值的属性。
注意点:
- 重心坐标在投影变换前后可能会发生改变,3D->2D三角形会改变
- 如果想插值一些三维空间的属性,例如深度值,应该算三维坐标系P点的重心坐标进行插值,不能在投影之后的三角形中做插值。
- 可以逆变换回三维做插值