加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

现代计算机图形学课程笔记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位置上。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有