OpenGL 簡介
1. OpenGL 全稱Open Graphics Library,是一個跨平台的第三方圖形繪制庫,可以用來繪制各種2D和3D圖形,像去年很火的全景和VR的視頻渲染,都是用到它
2. 由於GPU 具有高並行結構(highly parallel structure),所以GPU 在處理圖形數據和復雜算法方面擁有比CPU 更高的效率。 如下圖CPU 大部分面積為控制器和寄存器,與之相比,GPU 擁有更多的ALU(Arithmetic Logic Unit,邏輯運算單元)用於數據處理,而非數據高速緩存和流控制,這樣的結構適合對密集型數據進行並行處理。
3. GPU圖形繪制管線由四個階段組成:幾何階段,圖元裝配,光柵化階段,圖形硬件。
3.1 幾何階段,主要負責頂點坐標變換、光照、裁剪、投影以及屏幕映射,幾何階段主要由局部坐標系轉換到世界坐標,再轉換到視坐標,最后經過裁剪到屏幕坐標
局部空間
- 物體所在的坐標空間,用建模軟件(3DMAX)導出來的坐標
- 模型的所有頂點都是在局部空間:相對於物體來說是局部的
- 與其他物體沒有任何參照關系
世界空間
- 以固定的坐標位置為原點
- 當物體導入程序中時,每個物體在世界空間的位置不盡相同
- 物體坐標從局部空間轉換到世界空間
觀察空間
- 每個人從自己的角度出發,看到了不同的世界
- 攝像機的視角觀察到的空間
裁剪空間
- 期望所有的坐標落在一個特定的范圍,不在的被裁剪掉
- 由投影矩陣(Projection Matrix)指定的坐標范圍
- 平截頭體(Frustum)
- 正射投影、透視投影
透視投影(近大遠小)
視錐體(Field of View)
透視投影和正交投影對比
幾何階段轉換示意圖
3.2 圖元裝配
- 將頂點根據原始的連接關系還原出網格結構
- 根據索引將頂點鏈接在一起,組成線,面單元
- 對這些單元背面剔除、視域剔除
- 最后經過Triangle Setup得到三角面片,用於光柵化
3.3 光柵化
- 決定哪些像素被集合圖元覆蓋的過程
- 點的屏幕坐標浮點數 => 像素是整數 (10.4,20.5)=>(?,?)
- 根據兩個點繪制線段,3個點繪制三角形面片;畫線算法,區域圖元填充算法
Pixel Operation:
- 計算出每個像素的顏色值
- 消除遮擋面
- 紋理操作,也就是根據像素的紋理坐標,查詢對應的紋理值
- 混色:根據目前已經畫好的顏色,與正在計算的顏色的透明度(Alpha), 混合為兩種顏色,作為新的顏色輸出
- Filtering:將正在算的顏色經過 種 Filtering(濾波或者濾鏡)后輸出
3.4 圖形硬件
- Z buffer,視點到每個像素所對應的空間點的距離,根據Z值大小,判斷空間點的遮擋關系
- Stencil buffer,一個額外的 buffer,通常附加到z buffer中,如15位的z buffer加上1位的stencil buffer顯存中共享同一片區域
- Frame buffer,存放顯示輸出的數據,color buffer和z buffer的組合
4. 着色語言
- 賦予程序員靈活而方便的編程方式
- 盡可能的控制渲染過程,同時利用圖形硬件的並行性,提高算法的效率
- OpenGL 的 GLSL
- Direct3D 的 HLSL(High Level Shading Language)
- NVIDIA 公司的 Cg (C for Graphic)
- 語言是外殼,算法才是精髓
APP(應用程序)通過Programmable Vertex Processor和Programmable Fragment Processor控制渲染階段
4.1 頂點着色器
- 從 GPU 前端模塊(寄存器)中 取圖元信息(頂點位置、法 向量、紋理坐標等)
- 完成頂點坐標空間轉換、法向量空間轉換、光照計算等 操作,
- 將計算好的數據傳送到指定寄存器中
4.2 片段着色器
- 從上一步中獲取需要的數據,通常為“紋理坐標、光照信息等”
- 根據這些信息以及從應用程序傳遞的紋理信息(如果有的話)進行每個片斷的顏色計算
- 將處理后的數據送 光柵操作模塊
- 片斷就是所有的三維頂點 在光柵化之后的數據集合,這些數據還沒有經過深度值比較,而屏幕顯示的像素 都是經過深度比較的
4.3 頂點和片段結合圖
每個頂點數據都會執行一次頂點程序
每個片段都會執行一次片段程序

