计算机图形学笔记------变换与光栅化的理论知识
計算機圖形學筆記
參考圖書:Digital Signal Processing(forth edition)
數學物理方法 顧樵
部分圖片選自網絡,前面的數學基礎是之前的筆記,侵權刪
一點點數學基礎
變換基礎
光柵化
將一個圖像用像素點矩陣表示出來的過程稱之為光柵化,實際上光柵化的過程并不是現實設備完成的而是圖像自己確定自己的展示方式。
這里區分兩個概念
像素(pixel):即組成光柵的最小點
物理像素:設備上每個實際在發光的點
一個圖像可以表示為I(x,y):R?>VI(x,y):R->VI(x,y):R?>V
其中R∈R2R\in R^2R∈R2是平面上點的集合,V為色彩空間,以最簡單的平面黑白圖為例,每個平面上的點只有一個灰度值即V∈RV\in RV∈R
不過實際上除了要考慮像素點本身發出的光還要考慮像素點吸收和反射的光
我們終究是要把圖像在一個屏幕上顯示,屏幕可以認為是一個像素的二維數組,像素點總的個數稱之為分辨率(如720p,1080p,2k等)
在二維平面上如何組織和表示這些像素點變得十分重要,一般我們把這些像素放在二維直角坐標系上,用每一個像素的中心點(我們認為每一個像素都是一個正方形,然而實際上要比正方形復雜得多,實際上每個像素點上還要細分成不同的RGB子像素不同子像素排列方式不同比如很火的周冬雨排列,鉆石排列,貝爾排列等等)的位置來表示像素,最左下的像素的中心點坐標定義為(0,0)同時為坐標系的原點,最右上的像素點記為 (nx?1,ny?1)(n_x-1,n_y-1)(nx??1,ny??1),其中nx,nyn_x,n_ynx?,ny?為橫縱像素點個數即屏幕的width與high.
上圖中的建系方法是各像素中心點為參考表示的是相對位置,如果以整塊屏幕為參考我們可以得出下面的坐標系,它表示的是每一個坐標在屏幕上的位置
那么如圖藍色像素的相對位置是(2,1)但是實際位置是(2.5,1.5),整個屏幕的空間為(0,nx)?(0,ny)(0,n_x)*(0,n_y)(0,nx?)?(0,ny?)像素點空間為(0,nx?1)?(0,ny?1)(0,n_x-1)*(0,n_y-1)(0,nx??1)?(0,ny??1)
對于一個實際的圖像比如一個(?a,a)2(-a,a)^{2}(?a,a)2的正方形,如果想將其顯示在一塊(0,w)*(0,h)的屏幕上,我們要經過一個坐標變換才能夠完成這個變換有兩個方面
第一步:
第二步:
三角形
最基本的圖形就是三角形,首先已知三個點他們一定能確定出一個平面,并且三角形的內外邊界清晰,不存在內部奇點.所以其他復雜的多邊形也可以由大量的三角形去構成.
那么么現在的問題是我們拿到一個經過視口變換的平面三角形如何將它光柵化的問題,這個問題的實質就是如何確定每一個像素的中心點,確定好中心點就可以知道每一個像素點和三角形的位置了.
采樣即將一個函數離散化,也就是對于一個函數我們取不同的自變量得到不同的函數值稱之為采樣,在圖形學中就是利用像素中心對屏幕空間(width*high)采樣,即對于某一個函數在不同像素點中心他的值是多少.
對于如圖所示的三角形,我們可以先構建這樣一個函數inside()他的作用是判斷給定的像素中心是在三角形內部還是在三角形的外部(這里邊界也算內部) 即
inside(t,x,y)=={1if??point(x,y)int0if??point(x,y)notintinside(t,x,y)== \begin{cases} 1 &\text{if }\ point(x,y)\ in \ t \\ 0 &\text{if }\ point(x,y)\ not \ in \ t \end{cases}inside(t,x,y)=={10?if??point(x,y)?in?tif??point(x,y)?not?in?t?
有了這個函數我們可以寫出通過采樣來輸出這個三角形的代碼:
那么這個inside函數應該如何實現呢?假設有一個三角形p1,p2,p3p_1,p_2,p_3p1?,p2?,p3?和一個點QQQ
這個三角形由三個向量構成以向量p1p2\bm{p_1p_2}p1?p2?為例,若p1Q\bm{p_1Q}p1?Q與p1p2\bm{p_1p_2}p1?p2?做外積運算(p1p2×p1Q\bm{p_1p_2}\times\bm{p_1Q}p1?p2?×p1?Q),若結果指向紙面外那么QQQ在p1p2\bm{p_1p_2}p1?p2?的左側,同理可以對p1p0,p2p0\bm{p_1p_0},\bm{p_2p_0}p1?p0?,p2?p0?進行判斷
為了方便判斷,我們一般選取一個點作為起始點,然后順時針選取向量,這樣只要結果都為指向紙面外那么這個點就在三角形的外部.
對于邊界上的點結果為0,那么他們就不是指向紙面外的,我們正好可以不作處理,當然也可以特殊處理(就是可以點亮).
現在我們可以思考另一個問題,就是我們在采樣過程中一定必須要遍歷所有的像素點嗎?
這顯然是是沒有必要的如圖
超出藍色部分的像素點是完全沒有必要遍歷的,所以為了提高效率,我們可以取各個點x,y坐標的最大值只在這部分區域采樣,這樣取出的區域稱之為包圍和.
除了包圍和以外還有其他提高采樣效率的方法.
抗鋸齒
觀察之前生成的三角形我們可以發現他似乎并不像是一個完美的三角形,明顯這是因為我們采樣頻率很小,產生了一個光柵化的常見問題-----鋸齒(走樣).
想要理解走樣及其解決方法就必須取分析采樣
我們知道對于一個函數可以用一個三角級數來對它進行展開,這種展開方法稱之為傅里葉展開(這部分涉及到一些DSP的相關知識,傅里葉展開和變換是極其重要的數學知識不會的一定要去看),我們展開的項數越多(每一項的頻率越高)那么曲線的擬合就越好如圖:
對于一個曲線(信號)我們可以將他們分離成不同頻率的三角函數(信號)的和,對于分離出的信號進行采樣我們可以得出下面的結論:
對于分離出的不同信號我們進行采樣的間隔(頻率)如果一致的話,原信號頻率越高我們采樣完還原的就越不好即走樣即對兩個不同函數采用相同的采樣方法得到的曲線相同如下圖所示對黑色和藍色曲線采樣的結果是一致的.
濾波:去掉信號中特定頻率的部分
一般來說如果將一張圖片看做一個信號那么這張圖片上的邊界屬于這個信號中的高頻部分,因為邊界部分是劇烈變化的對應信號就是高頻部分.那么當我們對一個圖片(信號)做傅里葉變換得到的信號分離出高頻部分,就可以得到模糊的圖片的框架,這種濾波方式稱之為高通
當我們去除信號中的高頻信號,會去除掉邊界這樣我們得到了一張模糊的圖片,這種濾波方式稱之為低通.
只留下中間段的頻率可以獲得一些不明顯的邊界信息.
對一個圖片做如下的卷積操作(實際上就是對每一個像素點與其周圍的像素做平均)就會的到一個模糊的圖片
這種頻域相乘的的操作相當于只保留了低頻的部分,所以這種卷積操作相當于是一種低通濾波,濾波器稱之為低通濾波器,如果我們選的濾波器越大那么他保留的頻率就越低.
現在我們觀察下面的圖片,將a和c相乘可以得到e(相當于在時域上進行采樣),相當于頻域上的卷積得到f
觀察發現,f實際上是對原函數的一個重復操作,所以我們可以得到一個重要的結論即采樣等同于平移重復頻率的內容.
這樣我們就可以知道為什么采樣會導致走樣了,因為按照不同頻率采樣(即選取不同的沖擊函數)會導致其在頻域上以不同方式平移重復,如果采樣頻率過低那么得到的函數就會出現交疊的部分也就是所說的走樣.
除了鋸齒以外還會有其他因為采樣所產生的問題,摩爾紋和車輪錯覺
解決采樣問題的方法
1.濾波(模糊)
如圖我們可以先將圖片模糊化處理(濾波),之后再采樣這樣形成的圖片就和原來的圖片還原度變得高了很多.
結合之前說的采樣頻率的相關知識我們知道模糊的處理就是做一個低通濾波,即去除高頻的部分,那么低頻信號在重疊的時候就不會出現混疊的效果.
在實際操作中,低通濾波器的選取很重要,一般我們可以取一像素大小的低通濾波器來進行濾波.
實際上取平均的方法比較麻煩,實際上我們會采用近似的方法(MSAA),對于任何一個像素我們繼續對像素繼續進行劃分,在對所有的子像素進行取平均合成一個像素點的值.
其他抗鋸齒方法:FXAA,TAA,DLSS
總結
以上是生活随笔為你收集整理的计算机图形学笔记------变换与光栅化的理论知识的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HDU2571
- 下一篇: php跳转分站,PHP判断IP并转跳到相