现代计算机图形学课程笔记Shading3
(2023-03-28 17:33:28)
标签:
it |
分类: 技术 |
1. 三角形内插值:Barycentric Coordinates
要介绍插值算法,首先需要知道为什么我们需要插值。其实在上一节中已经介绍过,像Phong
Shading这样的算法,它需要在已知顶点法向后对每个像素求出法向,因此需要用到插值算法,更进一步的目的是希望能够在三角形内部获得一个平滑的过渡。当然除了对法向做插值,我们也可以对颜色、纹理坐标等做插值计算。
那么怎么做插值呢?这就需要用到重心坐标(Barycentric Coordinates)。
注意重心坐标并不是指三角形内重心的坐标,而是每个点的坐标表示形式不再是常用的直角坐标系,而是用重心坐标来表示任意点。
说起来有点绕,直接看下图,下图给出了重心坐标的示意图。下图中三角形三个顶点分别是A,B,C(假设是2D空间),
其中红点可以是三角形内任意的点,该点的真实坐标为(x,y),重心坐标为(α,β,γ),真实坐标和重心坐标满足如下关系:即该点的直角坐标是三个顶点直角坐标的线性组合,且系数之和为1,且每个系数是非负的。
(x,y)=αA+βB+γC=α(xA,yA)+β(xB,yB)+γ(xC,yC)
⇒s.t. α+β+γ=1
α≥0,β≥0,γ≥0
举例来说,A点的重心坐标为(1,0,0)
重心坐标
上面重心坐标的三个系数是从坐标的角度计算得到的,其实也可以从几何角度来计算。具体来说就是计算三角形面积占比。以下图为例,我们随便选取一个三角形内的点,然后将三个顶点和该点连接后可以得到三个子三角形,那么三个系数计算公式如下:
αβγ=AAAA+AB+AC=ABAA+AB+AC=ACAA+AB+AC
AA表示AreaA
重心坐标-几何
我们知道三角形重心的直角坐标是顶点坐标的算术平均,即xc=1/3(xA+xB+xC),那么很自然重心的重心坐标就是(1/3,1/3,1/3)
基于上面的介绍,这里给出任意点的重心坐标计算公式:
α=−(x−xB)(yC−yB)+(y−yB)(xC−xB)−(xA−xB)(yC−yB)+(yA−yB)(xC−xB)β=−(x−xC)(yA−yC)+(y−yC)(xA−xC)−(xB−xC)(yA−yC)+(yB−yC)(xA−xC)γ=1−α−β
介绍完了重心坐标,那我们怎么利用重心坐标来做插值呢?
其实很简单,我们首先假设三角形内每个点的重心坐标已经求解出来了,那么之后的插值计算就很自然了,因为重心坐标其实就是插值了。
举例来说,如果我们想要求三角形内任意点k插值后的法向nk,那么首先我们一直三个顶点的法向,则nk=αnA+βnB+γnC。
线性插值
但是有一点需要注意的是,3D物体投影到2D屏幕后,点的重心坐标可能是会发生变化的,比如3D时重心坐标可能是(0.5,0.2,0.3),
到了2D后就变成了(0.4,0.4,0.2),这样一来就可能导致差值结果产生较大偏差。
所以为了避免这种偏差,正确的做法是什么呢?举例来说,假如我们要求投影后三角形内所有点的深度信息,我们不能根据2D空间中三个顶点的深度信息做插值,而需要先计算出3D空间中的三角形内每个点的重心坐标,然后计算出3D空间中该点插值后的深度信息,最后将该深度信息填充到对应的2D位置上。
后一篇:“爱无能”的8个信号

加载中…