假設三角形的3個頂點
在modle space是Am、Bm、Cm
頂點乘上Model View Projection Matrix(MVP)後
變換到Projection space
MVP(Am) = A = ( A(x),A(y),A(z),A(w) )
MVP(Bm) = B = ( B(x),B(y),B(z),B(w) )
MVP(Cm) = C = ( C(x),C(y),C(z),C(w) )
MVP(Am) = A = ( A(x),A(y),A(z),A(w) )
MVP(Bm) = B = ( B(x),B(y),B(z),B(w) )
MVP(Cm) = C = ( C(x),C(y),C(z),C(w) )
P是位在三角形ABC上的1點
那麼P在Projection space的插值是 (見下面的圖P)
P(x) = A(x)α'+B(x)*β'+C(x)*γ'
P(y) = A(y)α'+B(y)*β'+C(y)*γ'
P(w) = A(w)α'+B(w)*β'+C(w)*γ'
P(x) = A(x)α'+B(x)*β'+C(x)*γ'
P(y) = A(y)α'+B(y)*β'+C(y)*γ'
P(w) = A(w)α'+B(w)*β'+C(w)*γ'
圖P
透視校正
把上式左右交換
α a/A(w)+β b/B(w)+γ c/C(w) = (a α' + b β' + c γ')/P(w)
α a/A(w)+β b/B(w)+γ c/C(w) = (a α' + b β' + c γ')/P(w)
再同乘P(w)後有
(α a/A(w)+β b/B(w)+γ c/C(w))*P(w) = (a α' + b β' + c γ')
(α a/A(w)+β b/B(w)+γ c/C(w))*P(w) = (a α' + b β' + c γ')
意思是:
把「先各自 / w再內插」的結果 * w
就能還原為「先內插的結果」
把「先各自 / w再內插」的結果 * w
就能還原為「先內插的結果」
舉例
A,B,C 除w 之後 會變成An、Bn、Cn
An = A/ A(w)、Bn = B/ B(w)、Cn = C/ C(w)
An(uv) = A(uv)/ A(w)
An = A/ A(w)、Bn = B/ B(w)、Cn = C/ C(w)
An(uv) = A(uv)/ A(w)
這時An、Bn、Cn的插值是Pn
Pn = An*α + Bn*β + Cn*γ
Pn(uv) = An(uv) *α + Bn(uv) *β + Cn(uv) *γ
Pn = An*α + Bn*β + Cn*γ
Pn(uv) = An(uv) *α + Bn(uv) *β + Cn(uv) *γ
從圖P可以看出來 P/P(w) = Pn
反過來就是
P = Pn * P(w)
P(uv) = Pn(uv) * P(w)
這樣就還原到/w之前的空間了
反過來就是
P = Pn * P(w)
P(uv) = Pn(uv) * P(w)
這樣就還原到/w之前的空間了
備註:P(z)是什麼?
P/P(w) 的幾何意義是,把P投影到z=1的平面上
對映到的是 ( P(x),P(y),P(w) ) / P(w) = ( P(x)/P(w) , P(y)/P(w) , 1 )
因為P(w)/P(w)永遠都是1
所以需要P(z)/P(w)來解決深度排序
對映到的是 ( P(x),P(y),P(w) ) / P(w) = ( P(x)/P(w) , P(y)/P(w) , 1 )
因為P(w)/P(w)永遠都是1
所以需要P(z)/P(w)來解決深度排序
從projection矩陣可以知道
如果Pview 是 camera space的P
P(z) = Pview(z)*a+b
投影矩陣對z的修正(我用的是Directx的版本,NDC的z會落在0~1之間) |
沒有留言:
張貼留言