2021年11月27日 星期六

透視校正

假設三角形的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) )

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


透視校正

(a α' + b β' + c γ')/P(w) = α a/A(w)+β b/B(w)+γ c/C(w)
意思是:「先內插的結果再 / w」 = 「先各自 / 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 γ')

意思是:
把「先各自 / 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、Bn、Cn的插值是Pn
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(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)來解決深度排序

從projection矩陣可以知道
如果Pview 是 camera space的P
P(z) = Pview(z)*a+b

投影矩陣對z的修正(我用的是Directx的版本,NDC的z會落在0~1之間)

沒有留言:

張貼留言