今日學習內容概覽:
- Finishing up Viewing
- Viewport transformation
- Rasterization
- Different raster displays
- Rasterizing a triangle
一、透視投影(Perspective Projection)
( 一 )粗略方法:
確定近平面(l,r,b,t),保持遠、近平面不的點變,將遠平面變為近平面一樣大小:
( 二 )細致處理:
有時通過垂直的視角(field-of-view,fovY)和寬高比(aspect ratio = width / height),(假設對稱性即L = -r,B = -t).
( 三 )轉換fovY和面為l,r,b,t
計算公式:
\(\tan \frac{fovY}{2} = \frac{t}{|n|}\)
\(aspect = \frac{r}{t}\)
二、規范立方體(Canonical cube)
在 MVP 后,即進行規范立方體到屏幕(畫到屏幕)
MYP概念:
- 模型轉換(載置對象)
- 查看變換(放置相機)
- 投影變換
- 正投影(長方體到“規范”立方體\(\left[-1,1 \right]^3\))
- 透視投影(平截頭體到“規范”的立方體)
( 一 )屏幕的定義:
- 像素的組合
- 數組大小即為——分辨率 eg:1920*1080
- 典型的光柵成像設備
( 二 )光柵化和屏幕的關系:
- Raster == screen in Germa
- Rasterize == drawing onto the screen
( 三 )像素(Pixel)
- 可通俗理解為:一個像素就是一個顏色的小正方形
- 顏色是由 RGB 組合而成
( 四 ) 屏幕空間定義:
像素的排列:
-
約定:
- 像素坐標為(x,y)形式,並且x,y為整數(相當於個數)
- 像素坐標范圍:(0,0)到(寬度-1,高度-1)
- 像素(x,y)的中心點是(x+0.5,y+0.5)
- 屏幕占比范圍(0,0)到(寬度,高度)
-
與z無關
-
Transform in xy plane: [-1, 1]2 to [0, width] x [0, height]
-
Viewport transform matrix:
三、顯示設備
( 一 )數控記號筆拉絲機
( 二 )激光切割機
( 三 )不同的光柵顯示器
-
示波器
-
陰極射線管
-
電視 - 光柵顯示(CRT 顯示器的應用)
右邊的圖像是隔行掃描技術(eg:將畫面分為兩部分,上半部分掃描奇數行,下半部分掃描偶數行),目前在一些視頻壓縮中仍有應用。缺點:容易造成畫面撕裂,尤其是高速運動(eg:體育運動出現鬼影)
- 幀緩存:內存為光柵顯示
顯存,也被叫做幀緩存,它的作用是用來存儲顯卡芯片處理過或者即將提取的渲染數據。如同計算機的內存一樣,顯存是用來存儲要處理的圖形信息的部件。
DAC——數模轉換器,又稱D/A轉換器,簡稱DAC,它是把數字量轉變成模擬的器件。D/A轉換器基本上由4個部分組成,即權電阻網絡、運算放大器、基准電源和模擬開關。模數轉換器中一般都要用到數模轉換器,模數轉換器即A/D轉換器,簡稱ADC,它是把連續的模擬信號轉變為離散的數字信號的器件。
- 平板顯示器
視網膜顯示器:分辨率已經大於人肉眼的分辨率屏幕。
LCD工作原理示意如下:
LCD——液晶顯示器,通過液晶將豎直的光扭轉為水平的光。
- Electrophoretic (Electronic Ink) Display
例如:kindle,通過黑白墨水,控制電子號,從而進行顯示。缺點:因為改變黑白朝向耗時,因此刷新率低。
三、光柵化:繪圖到光柵顯示
( 一 )網格
-
多邊形網格(Polygon Meshes)
-
三角形網格(Traingle Meshes)
( 二 )三角形 - 基本形狀圖元
-
Why triangles?
- 最基礎的多邊形
- 可由別的多邊形拆解而來
- 獨特的性質
- 保證是平面
- 能夠定義良好的內部
- 定義方法:可通過定義三角形的三個點,實現漸變效果
- 最基礎的多邊形
-
什么像素值近似三角形?
判斷一個像素(中心點)與三角形的位置關系===>通過采樣實現。
采樣:給一個連續函數得到值,即一個函數的離散化過程。
四、采樣
在評估一個點的函數取樣。我們可以通過采樣離散函數。如下:
for (int x = 0; x < xmax; ++x)
output [x] = f(x)
采樣是圖形學的核心理念,可以采樣的:時間(1D)、面積(2D)、方向(2D)、體積(3D)等等
( 一 )光柵化作為2D采樣
例如:如果每個像素的中心是三角形內
定義二元函數:\(inside(tri, x, y)\)(注:X,Y:不必為整數)
光柵化=采樣A 2D指示燈功能
for (int x = 0; x < xmax; ++x)
for (int y = 0; y < ymax; ++y)
image[x][y] = inside(tri, x + 0.5, y + 0.5);
這個循環函數讓像素中心值為 0 或 1 (0表示不在三角形內部,1表示在三角形內部),根據中心點為的值從而給予某種顏色。
( 二 )回顧:樣本位置
( 三 )回顧:叉乘
通過某一點(例如:Q點)與三角形\(P_{0}P_{1}P_{2}\)的邊長位置關系做判斷。規定某一個方向,以逆時針方向舉例,\(P_{2}P_{1} \times P_{2} \times Q\)得知,叉乘指向朝上,因此Q點在\(P_{2}P_{1}\)的右邊;同理可得,Q 點在\(P_{1}P_{0}\)的右邊,但 Q 點在\(P_{0}P_{2}\)的左邊。(點位於三條邊的方向並不完全一致)**====》因此,Q點在三角形\(P_{0}P_{1}P_{2}\)的外部。
如果是在像素中心點在邊界呢?
兩種方法:一種是不做處理(本堂課采用),另外是做特殊處理。
注:圖形學的第三方庫API如OpenGL和DirectX對邊界點有嚴格的規定。即中心點在三角形的上邊/左邊,則算作在三角形內部;若點在三角形的下邊/右邊,則不屬於三角形內部。
檢測屏幕中所有的像素
檢測像素的步驟:
1. 首先通過 x,y 的坐標從最小值到最大值選出包圍盒(Bounding Box)。(即藍色包圍部分,去掉第一列白色部分。此通過水平和豎直確定的包圍盒,還可稱為**軸向包圍盒=AABB包圍盒(Axis-aligned bounding box))**
2. 在區域內進行循環,使用inside函數確定像素中心點的值。
AABB是應用最早的包圍盒。它被定義為包含該對象,且邊平行於坐標軸的最小六面體。故描述一個AABB,僅需六個標量。AABB構造比較簡單,存儲空間小,但緊密性差,尤其對不規則幾何形體,冗余空間很大,當對象旋轉時,無法對其進行相應的旋轉。處理對象是剛性並且是凸的,不適合包含軟體變形的復雜的虛擬環境情況。
AABB也是比較簡單的一類包圍盒。但對於沿斜對角方向放置的瘦長形對象,其緊密性較差。由於AABB相交測試的簡單性及較好的緊密性,因此得到了廣泛的應用,還可以用於軟體對象的碰撞檢測。
光柵化加速方法之——增量三角形遍歷
這種方法是在每一行的從最左到最右,確定一個包圍盒。適用於窄長、旋轉的三角形(即實際在AABB盒中覆蓋了很少的像素。)
( 四 )實際屏幕中的光柵化
- 下面是兩個手機屏幕的光柵化圖像:
- iPhone :每個像素由3條(RGB)代表一個像素
- Galaxy :使用\(Bayer Pattern\)方法,使RGB均勻分布。現象:其中綠色點最多(觀察方法:只看某一種顏色,分別看三種顏色點,即可看出。)這是因為人眼對綠色更敏感,這樣看起來跟舒服。
- 彩色打印
如果加的顏色越多,那么會更黑;RGB值越高,圖片越亮。
( 五 )按照像素為一個正方形(本課程采用),展示一個示例:
-
采樣信號展示:
-
The Display Physically Emits This Signal(進行填充后為左圖,實際圖形為右圖)
由此,發現一個問題,采樣填充后的圖像並不完全符合原始圖像,出現鋸齒(Jaggies)現象。同樣的現象見下圖:
原因: 因為像素本身具有大小,采樣率不高,從而信號走樣(Aliasing)。
目前,仍是圖形學一直不斷改進的問題,下節課將介紹如何解決“鋸齒”問題,引入抗鋸齒和反走樣的概念。