例如:
我们给一个三角形的三个顶点定义了如下属性:
- Position : P0(x0,y0,z0),P1(x1,y1,z1),P2(x2,y2,z2)
- TexCoord : T0(u0,v0),T1(u1,v1),T2(u2,v2)
使用重心坐标 α,β,γ,插值后得到的任意 TexCoord
T′(u,v)=αT0+βT1+γT2使用裁剪空间的 wii=1,2,3 做完透视矫正后,可以得到:
T(u,v)=αw01+βw11+γw21αT0w01+βT1w11+γT2w21我们令 qi=wi1i=1,2,3
将公式改写为:
T(u,v)=αq0+βq1+γq2αq0T0+βq1T1+γq2T2而我们又知道 u,v 三角形内部的点的函数 u(x,y),v(x,y),将三角形内部的点 (x,y) 映射到纹理空间得到纹理坐标 (u,v)
所以
T(u(x,y),v(x,y))=αq0+βq1+γq2αq0T0+βq1T1+γq2T2而重心坐标也是和三角形内部的点 P(x,y) 相关的,我们一般通过面积求得重心坐标:
α=AA0,β=AA1,γ=AA2其中
A=(P1−P0)×(P2−P0)A0=(P1−P)×(P2−P)A1=(P2−P)×(P0−P)A2=(P0−P)×(P1−P)而 P 是与 x y 相关的所以
T(x,y)=α(x,y)q0+β(x,y)q1+γ(x,y)q2α(x,y)q0T0+β(x,y)q1T1+γ(x,y)q2T2所以我们要求的是
∂x∂T(x,y)与∂y∂T(x,y)虽然这是一个向量值函数求导,但是我认为没必要引入雅可比矩阵,因为这会增加复杂度,我们直接使用小学二年级就会的对分式的求导法则
(g(x)f(x))′=g(x)2f′(x)g(x)−f(x)g′(x)即:上导下不导减去上不导下导除以分母的平方
我们令分子为
N(x,y)=α(x,y)q0T0+β(x,y)q1T1+γ(x,y)q2T2令分母为
D(x,y)=α(x,y)q0+β(x,y)q1+γ(x,y)q2那么原公式写为
T(x,y)=D(x,y)N(x,y)∂x∂T(x,y)=D(x,y)2Nx(x,y)D(x,y)−N(x,y)Dx(x,y)∂y∂T(x,y)=D(x,y)2Ny(x,y)D(x,y)−N(x,y)Dy(x,y)我们这里拿 Tx 举例, Ty 同理
对于 Tx 我们只需求得 Nx(x,y) 与 Dx(x,y) 即可,而他们都是线性函数,求导非常简单,所以最终问题变为 α、β、γ 怎么求导
拿α举例,其他同理
α(x,y)=AA0(x,y)我们将
A0(x,y)=(P1−P)×(P2−P)=(x1−x)(y2−y)−(y1−y)(x2−x)A0(x,y)=x1y2−y1x2+x(y1−y2)+y(x2−x1)代入
α(x,y)=Ax1y2−y1x2+x(y1−y2)+y(x2−x1)∂x∂α=Ay1−y2∂y∂α=Ax2−x1好了经过这些步骤其实我们就已经能将 T(x,y) 的导数求出来了,其实我们可以对 Tx 与 Ty 进行一步化简,因为我们知道
T(x,y)=D(x,y)N(x,y)而我们发现 Tx 与 Ty 中存在一个 D(x,y)N(x,y) 结构,所以可以将 Tx 写成
∂x∂T(x,y)=D(x,y)Nx(x,y)−T(x,y)Dx(x,y)Ty 同理
最后我们发现 屏幕空间导数 其实只和 重心坐标 和 公式的结构 相关 与属性是无关的,所以我们可以将 T 换成任何三角形顶点的属性A