【OpenGL ES】光栅化插值原理和射线拾取原理
1 前言
最近在推导光栅化插值公式和射线拾取公式,发现计算过程中有很多共同点,因此将它们放在一篇文章里介绍。具体共同点如下。
- 都引入了四面体模型
- 都以四面体的三条边作为基向量构建坐标系(非直角坐标系)
- 都需要求解射线向量在基向量上的坐标
2 光栅化插值原理
光栅化要解决的问题:如下图,已知三角形的三个顶点的坐标及其他属性(如颜色、纹理坐标、法线向量、切线向量、副切线向量等),对于三角形内任意一点,若已知其坐标,求该点的颜色、纹理坐标等属性的值。
进一步细化问题:如下图,O 点是坐标原点,已知 A、B、C、Q 4 个点的坐标,假设 Q = x · A + y · B + z · C,求 x 、y、z 的值。
定义向量如下。
向量 d 可以用向量 a、b、c 线性表示如下。
使用矩阵表示如下。
求解向量 m 如下。
说明如下:
- 向量 m 的几何含义是:若以向量 a、b、c 为坐标轴建立坐标系(非直角坐标系),向量 m 表示向量 d 在该坐标系下的坐标。
- 由于 Q 点在 ΔABC 的内部,因此 mx + my + mz = 1,并且 mx >= 0、my >= 0、mz >= 0。
- 如果 mx = my = mz = 1 / 3,则 Q 点一定是 ΔABC 的重心。
2 射线拾取原理
参考:直线与三角形相交Moller Trumbore算法推导。
如下图,已知 A、B、C、P 4 个点的坐标,向量 n 是由 P 点发射的单位方向向量,Q 点是向量 n 与 ΔABC 的交点,求 Q 点坐标。由于 Q = P + d,因此本节只求向量 d 的坐标。
定义向量如下。
向量 n 可以用向量 a、b、c 线性表示如下。
使用矩阵表示如下。
求解向量 m 如下。
如果 mx、my、mz 中有一个为负数,说明交点 Q 一定在 ΔABC 外部;如果 mx + my + mz = 0,说明向量 m 与 ΔABC 平行。
由于向量 d 与向量 a 线性相关,并且 Q 点在 ΔABC上,可以得出以下方程,求解后即可得到向量 d 的坐标。