【现代计算机图形学 GAMES101】 第五讲:光栅化(一)
上節回顧
上節主要提到了觀測變換 (Viewing transformation), 其中包括了視圖變換和投影變換。所謂的視圖變換就是利用攝像機和物體的相對位置關系,始終把攝像機從任意一個位置移動到經典的原點位置,看向-z,并且向上方向是+y。并且保持其他物體和攝像機一樣的移動。此時,我們就可以得到所有的物體都是由一個標準位置的相機看過去的,此時我們要做的就是把它從三維投影到二維。投影分為正交投影和透視投影。
區別:
- 正交投影:把深度信息忽略,假設相機放的無限遠
- 透視投影:我們可以獲得一個近大遠小的效果
在各種觀測變換完了之后,場景里的所有物體都會被變換到-1到1的三次方這樣一個經典的立方體里面,那下一步是什么?那這就引出了這節的光柵化的內容(其實就是把立方體里的內容畫在屏幕上)。那該如何光柵化,怎么畫呢?
視錐的定義
首先對于上節課,還有一個剩余內容。在正交投影里,我們需要六個值(上下左右遠近),也就是x,y,z的覆蓋來定義立方體。那對于透視投影,除了假設中已有的n和f,我們還需要哪些信息來定義一個視錐(frustum)呢?
aspect ratio = width / height 寬高比
vertical field-of-view (forY)垂直可視角度
有了這兩個概念,我們就利用這些值來求出近面的高度和寬度,那當然也就可以進一步計算出正交投影中的六個值(上下左右遠近)
光柵化:概念導入
那回過來,在MVP做完了之后
Model transformation(placing objects)
View transformation(placing camera)
Projection transformation
那么在這三步做完了之后,所有的物體都會被轉化到經典的-1 到 1 的立方這個立方體里面去,最后要把這個畫在哪里呢?
答案當然是屏幕上。
首先來看,對于圖形學,什么是屏幕呢?
是一個二維的數組,數組中的每一個元素是一個像素。屏幕是一個典型的光柵成像設備。而所謂的Raster其實就是德語里屏幕的意思,而Rasterize光柵化,就是把東西畫在屏幕上。所以把東西畫在屏幕上的過程就是光柵化的過程。
那對于像素呢,像素(pixel is the short for “picture element”)在我們這門課中認為其是一個小方塊,且塊中內部的顏色是完全相同的,即最小單位,我們用256個等級0-255來表示灰度,同時可以用rgb三個值來定義顏色。
那定義完屏幕,我們再定義一下屏幕空間。
其實就是一個坐標系。本課中將坐標原點定義在左下角,用(x,y)(x、y 為整數)這樣的形式來定義一個像素,像素下標從(0,0)到(width - 1,height - 1)。且(x,y)像素的中心在(x + 0.5, y + 0.5)。屏幕范圍從(0,0)到(width,height)
那回過來,我們本來是要干什么呢?我們有一個-1到1的三次方的立方體,要把它轉化到屏幕上,那自然就要做從-1到1三次方到屏幕(0到width乘以0到height)這么一個空間的變換。
首先,三維到二維,我們需要先去掉一個維度,那對于z軸,我們先忽略,z的用途之后再說。然后對于x、y,將其從-1,1^2 拉到[0,width]x[0,height]就簡單了,用一個如下的轉換矩陣。
此處這個變換叫做視口變換。就相當于把這個-1到1的平方轉換到屏幕空間。
那么到這一步,不管我們之前是通過aspect和寬高比定義的frumstum還是通過正交投影的立方體,我們都已經變換到-1 到1 的三次方了,且現在我們已經把它的xy放在屏幕上了,那現在我們就相當于已經得到了一張場景的虛擬照片了。
下一步就是把圖打撒成像素,真正的畫在屏幕上。這也就是所謂的光柵化。
光柵化
不同的光柵顯示設備:
- 早期的示波器:Oscilloscope,CRT顯示器
- 成像原理:陰極射線管,通過掃描劃線的方式來成像,有時為了畫的快一點會采用隔行掃描的技巧,(某時刻畫奇數行,下一時候畫偶數行的方式。),通過視覺暫留的效應來減小成像的工作量。
這頁是講到現在的顯示設備都是通過內存中的一塊區域來映射到屏幕上。
現在的主要顯示設備還是平板顯示設備:LCD液晶顯示器。
這里是簡單介紹了一下液晶的顯示原理。液晶通過自己的不同排布影響光的偏振方向來決定一個像素顯示什么。
LED發光二極管顯示設備,墨水屏(刷新率很低)等等。
那現在回到我們的主線,如何在這么多的成像設備上畫東西。假設還是如上,屏幕是由像素構成的,像素的顏色一致的方塊。
首先,在光柵化操作中,我們常用三角形來組成其他三維空間,二維空間中的圖形。為什么我們常用三角形呢?
- 三角形是最基礎的多邊形。
- 其他多邊形都可以被拆成三角形。
- 三角形一定在一個平面上(四邊形就不一定)。
- 三角形的內外很容易被定義。
- 可以通過三角形的頂點屬性來確定三角形內任意一個點的屬性(重心插值)。
接下來就是在已有三角形在屏幕上的位置信息之后,我們該如何確定逼近這個三角形的像素點集合。這個就是光柵化中重要的一個概念,判斷一個像素和三角形的位置關系。更確切的是,我們考慮像素的中心點和三角形的位置關系。
一個簡單的做法來做光柵化,就是采樣。
此處的采樣是指用一個連續的函數,去遍歷每一個位置,看函數值是多少。這相當于是把一個函數離散化的過程。
那對于我們此處這個例子中,我們要判斷像素中心是否在三角形內,即下面這個函數的函數值到底是1還是0。
那要如何做呢,還和上面一樣,考慮所有的像素中心,遍歷全屏幕。
采樣過程是這樣,那具體判斷函數該如何實現?
用三次向量的叉積來實現。從而也就可以確定對于每個像素要不要填上顏色。另外要注意對于邊上的點,要么不處理要么特殊處理,自己定義就行,沒有關系。
剛才我們提到的這個是通過采樣來做光柵化的過程,那在這個過程中,還可以有一些簡化的操作。如,剛才是對整個屏幕的檢查,我們可以簡化到不同坐標下最小值到最大值的檢查,這樣可以簡化一點計算量。那我們稱這個藍色區域為包圍和,這個嚴格叫軸向的包圍和,X-alied bounding box ,縮寫為aabb。
甚至對于一些特殊情況,還可以考慮采用對每一行選取最大最小邊界來限制采樣范圍,這樣的方法使用于于窄長且有一定旋轉角度的三角形。
但是這樣的采樣方式會導致鋸齒的結果(走樣),那原因就是因為像素本身有一定的大小,并且由于采樣率對于信號的頻率是不夠高的,所以就導致了信號的走樣問題。
總結
以上是生活随笔為你收集整理的【现代计算机图形学 GAMES101】 第五讲:光栅化(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt5使用Poppler实现PDF阅读器
- 下一篇: 怎么用计算机算化学,化学计算机