1.相機的可視面,寬高,可以得到長寬比
2.FOV(field of view視場角),根據垂直可視角度fovY和長寬比可以得到水平可視角度fovX
1.右邊是視椎的近平面,點(1,t,n)與z軸的夾角是fovY/2
2.t是z的值,b是-t,近平面的高就是2t,r就是x的值,l是-r,近平面的寬就是2r
3.於是可以得到右邊兩個等式
1.左下角是原點,每個像素用(x,y)整數表示,圖中藍色像素是(2,1)
2.像素的寬高是1,像素的中心是(x+0.5,y+0.5)
3.屏幕的範圍是從(0,0)到(width,height)
1.忽略z,實質還是壹次平移加壹次縮放
2.因為MVP得到的是中心在原點,所以要先平移,讓左下角位於原點,然後把x和y拉伸到屏幕的大小
不管是二維還是三維,圖形都可以分解成壹定數量的三角形
1.實質就是判斷點否在三角形內
2.定義壹個函數inside(tri,x,y)來輸出是否在三角形內,然後遍歷整個屏幕中的像素
1.利用向量的叉乘,p2p0 x p2q,p0p1 x p0q,p1p2 x p1q三個結果如果是同號的,則在三角形內,否則在三角形外
在邊緣上的點再不同情況下可以算也可以不算.
1.將三角形包圍在內的矩形叫做bounding box
2.p1,p2,p3中取maxX和maxY,就得到壹個優化後的bounding box,可以提高效率,除此之外還有很多優化方案
三角形光柵化之後,由於像素點本事有大小,因此就會產生鋸齒(Aliasing)
鋸齒產生的原因是采樣率的問題,采樣的概念在圖片,視頻.音頻中通用,低采樣率可以降低質量,加快處理速度,但是會產生走樣(Artifacts),鋸齒便是其中壹種情況.
顯示器會在刷新的時候隔行刷新,例如第壹幀刷新奇數行第二幀刷新偶數行,以此提高效率,但是會在壹定程度上造成走樣,或者叫做瑕疵.
上圖中叫做摩爾紋,是采樣的時候,為了降低質量去除奇數行或者偶數行像素產生的.
信號變換的太快以至於采樣的速度很不上,就造成了Artifacts
先對場景,或者說信號進行模糊(濾波)處理,然後再采樣,可以在壹定程度上反走樣
註意如果先采樣,再做模糊是達不到效果的
圖二中:
同樣的采樣頻率,信號頻率越快,就越會走樣,上面的根據采樣可以大概的還原出信號函數,但是下面的已經完全不能還原了
圖三中:
在藍色函數中進行采樣,采樣之後還原,還原出來的是顯然只能是黑色函數,和原本的藍色已經差的太遠;也可以理解成,用同樣的采樣頻率去采樣兩種頻率的信號,結果卻完全相同
傅裏葉變換可以把時域變成頻域:
1.左邊的圖像,叫做時域,右邊的圖叫做頻域,是左邊的圖經過傅裏葉變換生成的
2.右邊圖像的信息由亮度在不同的位置表示出來,外圍的是高頻,中心的是低頻
3.水平和數值的十字高亮,是因為圖片不是重復信號,沒有時間信息,因此處理的時候會把圖片進行平鋪,壹張接壹張,當圖像切換邊界的時候,會產生劇烈的變化,從高頻到低頻全部都產生了變化,就出現了十字高亮
去除低頻信息:
1.將右邊的中心低頻信息抹去,逆傅裏葉變換,從右向左重新生成圖片,叫做高通濾波,也就是只有高頻信息可以通過
2.由此可見,只剩下邊緣,或者說邊界,就是顏色和紋理等等細節發生劇烈變化的時候,就對應著高頻的信息.
去除高頻信息:
1.低通濾波,圖像的邊界已經看不到了,只剩下色塊表示的低頻信息
選擇性的去除不同的頻率區域:
1.產生不同的效果,圖壹去除了最低頻的色塊和高頻的邊緣,圖二去除了大量低頻的色塊,和高頻的信息,通過這種控制,可以得到不同程度的細節信息
卷積Convolution:
1.首先是壹個壹維的信號,方便理解
2.然後是壹個過濾器,過濾器從左向右移動,每次移動壹個單位,移動之後計算過濾器中心對應的信號值,計算加權平均值,然後寫入采樣,最終得到壹個采樣結果
3.卷積就是模糊操作
1.把信號(圖)用濾波器做卷積(圖變成另壹張)
2.上壹步等效於,把圖通過傅裏葉變換,生成頻域,再把濾波器也傅裏葉變換,兩者相乘,最後再逆傅裏葉變換,就得到了和1相同的另壹張圖
低通濾波器:
1.每個像素周圍八個像素都乘1,再加起來,然後除上9
2.這個box越大,圖像越模糊,如果是最小的box,則相當於沒做濾波,圖像就沒變化
3.上圖兩個盒子,是時域圖像,也就是黑白色塊,右邊頻域圖
MSAA抗鋸齒:
把壹個像素點細分成4個,甚至16個,通過三角形覆蓋的點個數,取壹個百分比,占三個就是75%,占壹個就是25%
FXAA:采樣生成圖片之後,通過圖像處理,把鋸齒給替換掉,效率很高
TAA:把MSAA的樣本分布在時間上,復用前面幀的處理
DLSS:深度學習超采樣(超分辨率),50x50的圖片放到200x200需要補充像素,因此功能就是放大圖片
後畫的東西會覆蓋先畫的東西,計算機繪制沿用畫家算法的時候也是這麽做的,遠近或者說遮擋關系,叫做深度關系
壹種互相遮擋的情況,畫家算法無法解決這種場景.
深度緩存算法:
1.前面說到三個互相遮擋的三角形,無法確定深度關系,所以換個角度,去確定每個像素的深度,生成渲染後的圖片的同時,也生成壹張用於保存每個像素深度信息的圖
1.左邊是渲染後圖
2.右邊是深度圖,離相機越近的點,顏色越黑
3.假設首先只有地板,地板的深度圖是近黑遠白,現在添加壹個圖中的鏤空立方體進去,像素點a原本顯示的地板有壹個深度x,現在點a也同時處在立方體上,立方體給了a另壹個深度y,根據x和y就可以決定地板和立方體的遮擋關系
1.首先將場景分解成壹定數量的三角形
2.將三角形全部光柵化
3.壹開始所有的像素深度緩存值是無限大,也就是最遠,遍歷所有三角形的所有像素,然後和深度圖的所有像素點對比,如果深度比像素存儲的深度要小,說明應該要覆蓋原來的像素,就把深度重新寫到這個像素中.
4.這個算法與順序無關,也沒有做排序,只是在記錄壹個最小值,大的值不做任何處理,因此復雜度僅為O(n)
1.R代表無限大
2.5比R小,則重新寫入
3.加入第二個三角形,跟R和5相比,比5大要被原來的三角形遮擋,比5小的會遮擋原來的三角形
4.這兩個三角形插入到了壹起,互相遮擋壹部分