- 其實OpenGL的流水線,對我學習來講只能算是一個概念性的東西。畢竟OpenGL也在發展,流水線也不會是一成不變的。
- 不過理解流水線的過程,重點在於理解每一步的做用,進而能夠如何銜接起來,完成整個繪製圖像的工做。順序不必定相同,但仍能完成工做,但效率上確定會有差。
狀態機
- 在OpenGL中,咱們輸入的老是
- 但同時咱們也會改變許多
- 好比
- 當前頂點顏色glColor
- 當前頂點的法向量glNormal
- 當前相機的位置、朝向、正向gluLookAt
- 做用於當前 頂點 的旋轉、平移、縮放效果
- ……
- 因此咱們叫OpenGL是一個狀態機,由於你輸入的每個頂點數據,在那一行代碼的時刻就有各類各樣的狀態對應着這個頂點,而這個頂點也必須通過這些狀態的變化後,纔是最終你所但願繪製的頂點
流水線的工做過程
- 因此咱們有了什麼?
- 世界座標系下的一堆頂點數據
- 每一個頂點所對應的各類狀態變量
- 其餘內容如視景體、視口……
- 想象一下如何生成最後的圖像
- 對於頂點,咱們須要把各類狀態做用在上面,好比你設置的顏色、光照模型下這個頂點應該是什麼顏色、進行的旋轉等變換、頂點相對於相機的座標、若是有透視效果會讓頂點的座標發生偏轉,,,,,,以後纔算一個真正的頂點
- 對於這些點,咱們還須要肯定這些頂點構成了怎樣的圖形,OpenGL裏成爲圖元,如這三個頂點的含義是一個三角形,那四個是一個四邊形,,,,,,這些信息就須要裝配起來,不然頂點只是一個點,組成圖形後纔有更深的意義
- 對於圖元,咱們進一步根據你設置的視景體(三維的區域,只有區域內部纔會被用來生成圖像)來進行裁剪,剩下的圖元就是要用來生成圖像的,只是這個時候數據都是連續的數學抽象表達,而圖像倒是離散的像素點
- 因此,咱們進一步進行光柵化(也叫掃描轉換),確實每個圖元對應了哪些像素。好比一條線段只有兩個頂點的數據,兩個頂點會至少各佔一個像素的位置,可是這條線段要連續,就要讓這條線段進一步佔用兩個頂點之間的像素的位置。因而咱們獲得了一個個像素的數據,OpenGL裏稱之爲片斷或片元
- 但這些像素尚不能做爲最終的圖像的像素,進一步的片斷處理會根據是否有紋理貼圖進一步修改像素的顏色、對於三維空間中的物體的遮擋關係根據某種方法只顯示在前面的物體、是否須要對鋸齒效果進行反走樣等等……
- 大概就是這樣
細說流水線
其實我也只是學了不多的內容而已,不過做爲一個簡單的理解入門仍是勉強夠格的算法
- 頂點處理
- 座標
- 模型視圖矩陣
- 投影矩陣
- 光照模型
- 光照分析
- Phong光照模型
- Blinn-Phong光照模型
- 裁剪
- 線段裁剪算法
- Cohen-Sutherlend算法
- Sutherland-Hodgeman算法
- 多邊形裁剪算法
- 光柵化(掃描轉換)
- 片斷處理
- 隱藏面消除
- 對象空間算法
- 畫家算法
- 深度排序
- 背向面剔除(多邊形揀選)
- 圖像空間算法
- 深度緩存ZBuffer