三角形内部插值:重心坐标/Interpolation Across Triangles: Barycentric Coordinates

为什么要在三角形插值:我们有很多操作是在三角形的顶点完成的,希望在三角形内部有个平滑的过渡
插值什么内容:映射纹理uv,颜色,法线等。基本上可以对三角形顶点上任意的属性插值
如何做插值:重心坐标

在一个三角形ABC平面内所形成的任何一个点(x,y),都可以表示成三个顶点a、b、c坐标的线性组合,
只要满足线性组合的条件 α + β + γ = 1 \alpha+\beta+\gamma = 1 α+β+γ=1
虽然是三个系数,但有和为1的限定,实际上只是两个数。就像三角形的平面是二维的,二维只需要两个数。
如果点在三角形内部,还需满足三个系数都非负

A点的系数即为 (1,0,0)

点的重心坐标可以通过面积比求出:
一个点分别与三个顶点连线后。划分出顶点和它对面的三角形(即不相邻的三角形)。通过面积比可求出重心坐标

三角形的重心。重心可以把三角形均等面积划分出三份。通过上面的定义得出( 1 3 {1}\over{3} 31, 1 3 {1}\over{3} 31, 1 3 {1}\over{3} 31)

重心坐标最终的公式

任何一个点颜色的插值:可以通过重心坐标的系数求出
注意:重心坐标在投影变换下不能保证重心坐标不变:假如一个空间中的三角形,可以算出内部其中一个点的重心坐标,当三角形投影到某一平面时,会发生变化。根据投影后得到三角形坐标,重新算该点的重心坐标,会得到不一样的结果
因此需要用空间中的三角形坐标做插值,而不能用投影后的三角形坐标做插值
所以求深度时,需要把三角形的顶点值经过逆变换后,找到在三维空间中的坐标,再进行插值计算
应用纹理/Applying Textures

屏幕上任何一个采样点,有一个位置,即可知道在这个位置上插值出来的(u,v)在哪,在纹理上查询对应(u,v)的值。即对于纹理位置上的颜色。可以认为这个纹理的颜色就是漫反射系数
纹理的放大/Texture Magnification
如果纹理太小时,需要放大

Nearest
对任何墙上的一个点(一个像素),都可以找到其对齐纹理上的一个位置,可能不是整数,但把它四舍五入当做整数。这样相当于在一定范围内,我们要查找的是一个相同的纹理上的像素。
纹理上的像素叫texel
可能一个像素周围的3x3或5x5的像素都会映射到一个相同纹素。即找最近的纹素

双线性插值
如上图,一个高分辨率的像素映射到一个低分辨率的纹理

本文详细解释了在三角形插值中的重心坐标概念,以及如何在纹理映射、纹理放大、Mipmap和法线贴图等方面进行平滑的过渡插值。文章还介绍了环境贴图、凹凸贴图、位移贴图等技术在3D图形中的应用,以及Blinn-Phongshader和displacementshader的实现细节。
最低0.47元/天 解锁文章
2525

被折叠的 条评论
为什么被折叠?



