OpenGL 名詞解釋
OpenGL (Open Graphics Library) 是用于渲染2D 3D矢量圖形的跨語(yǔ)言 跨平臺(tái)的應(yīng)用程序編程接口(API)
OpenGL ES (OpenGL for Embedded Systems) 是OpenGL的子集 去掉了openGL 里面許多非絕對(duì)必要的特性 針對(duì)手機(jī) PDA 和游戲主機(jī)的嵌入式設(shè)備而設(shè)計(jì)的帽芽。
Metal WWDC2014年推出的新技術(shù) 能夠?yàn)?D圖像提高10倍的渲染性能
以上三個(gè)框架的本質(zhì)都是利用GPU芯片來(lái)高效渲染圖形和圖像 圖形接口是開(kāi)發(fā)者唯一能夠接近GPU的方式
OpenGL上下文(context)
在應(yīng)用程序調(diào)用任何openGL指令之前,首先得創(chuàng)建openGL的上下文 類似于我們使用對(duì)象(object) 之前得初始化 這個(gè)上下文是一個(gè)非常龐大的狀態(tài)機(jī) 保存了openGL中的各種狀態(tài)
OpenGL 的函數(shù) 本質(zhì)上都是對(duì)openGL上下文這個(gè)狀態(tài)機(jī)中的某個(gè)狀態(tài)或者對(duì)象進(jìn)行操作 對(duì)openGL指令的封裝 是可以將openGL的相關(guān)調(diào)用封裝成一個(gè)面向?qū)ο蟮腁PI
openGL上下文是一個(gè)巨大的狀態(tài)機(jī) 切換上下文一般會(huì)產(chǎn)生巨大的開(kāi)銷 但是繪制不同的模塊 可能會(huì)需要使用完全獨(dú)立的狀態(tài)管理 基于此 可以在程序中創(chuàng)建多個(gè)不同的上下文 在不同的線程中使用不同的上下文 不同的上下文之間可以共享紋理 緩沖區(qū)等資源 這種工作方式 會(huì)比反復(fù)切換上下文 或者大量修改渲染狀態(tài) 會(huì)更加的高效
OpenGL狀態(tài)機(jī)
描述了一個(gè)對(duì)象在他的生命周期內(nèi)經(jīng)歷的各種狀態(tài) 發(fā)送轉(zhuǎn)變的原因 狀態(tài)間的轉(zhuǎn)變 轉(zhuǎn)變的條件 轉(zhuǎn)變中執(zhí)行的活動(dòng) 湾蔓。具有以下的特點(diǎn)
有記憶功能 能記住當(dāng)前的狀態(tài)
可以接受輸入 根據(jù)輸入的內(nèi)容 和自己原來(lái)的狀態(tài) 來(lái)修改自己當(dāng)前的狀態(tài) 并且可以有對(duì)應(yīng)的輸出
當(dāng)前進(jìn)入特殊的狀態(tài)比如說(shuō)停機(jī)狀態(tài)的時(shí)候 就不再接受輸入 停止工作
渲染(Rendering).
將圖形/圖像數(shù)據(jù)轉(zhuǎn)換成3D空間圖像的操作叫做渲染
頂點(diǎn)數(shù)組(VertexArray)和頂點(diǎn)緩沖區(qū)VertexBuffer)
畫(huà)圖一般來(lái)說(shuō)先畫(huà)圖像的骨架 褐望,然后再往骨架里面填充顏色 OpenGL 也一樣 奋早。 頂點(diǎn) 數(shù)據(jù)就是圖像的骨架 OpenGL中的圖像是有圖元組成的 OpenGLES 有三種類型的圖元 :點(diǎn) 線 三角形 頂點(diǎn)數(shù)據(jù)可以存在內(nèi)存中 存在內(nèi)存的這部分?jǐn)?shù)據(jù)叫做頂點(diǎn)數(shù)組 更高效的辦法是預(yù)先傳入到顯存中 這部分顯存 就叫做頂點(diǎn)緩沖區(qū)
管線 OpenGL在渲染圖形的時(shí)候會(huì)經(jīng)歷一個(gè)一個(gè)的節(jié)點(diǎn) 就可以理解為流水線上的每一個(gè)步驟 就像流水線上做產(chǎn)品一樣 這個(gè)固定的順序是從開(kāi)始的第一步 第二步 一直到最后一步 順序不能亂
固定管線 存儲(chǔ)著色器
早期的OpenGL中 封裝了很多種著色器程序塊 這些固定的著色器(shader)程序來(lái)完成圖形的渲染 開(kāi)發(fā)者不需要關(guān)注底層實(shí)現(xiàn) 只需要傳入相應(yīng)的參數(shù)就可以了
但是隨著使用常用越來(lái)越豐富 固定管線或者存儲(chǔ)著色器已經(jīng)不能滿足需求 這時(shí)候就有一個(gè)步驟變成了可以自己自定義編程 就像iOS中一般不復(fù)雜的界面可以調(diào)用系統(tǒng)已有的控件 但是不規(guī)則的圖形 就需要開(kāi)發(fā)者自己繪制了
著色器程序
在固定渲染管線架構(gòu)變成了可編程渲染管線 OpenGL在調(diào)用繪制函數(shù)之前 需要指定著色器程序 常見(jiàn)的著色器有頂點(diǎn)著色器 片段著色器/像素著色器 幾何著色器 曲面細(xì)分著色器 到OpenGL3.0 還是只支持頂點(diǎn)著色器和片段著色器
OpenGL 處理著色器程序的時(shí)候 要通過(guò)編譯 鏈接等步驟 生成了著色器程序 步驟分為
1 頂點(diǎn)著色器對(duì)傳入的頂點(diǎn)數(shù)據(jù)進(jìn)行運(yùn)算
2 圖元裝配 頂點(diǎn)轉(zhuǎn)換成圖元
3 光柵化 將圖元這種矢量圖形 轉(zhuǎn)換成柵格化的數(shù)據(jù)
4 將柵格化的數(shù)據(jù) 傳入片段著色器中進(jìn)行運(yùn)算 片段著色器 對(duì)柵格化的數(shù)據(jù)中的每一個(gè)像素進(jìn)行計(jì)算 來(lái)決定像素的顏色
頂點(diǎn)著色器 vertexShader
一般來(lái)處理圖形的每個(gè)頂點(diǎn)的變化 旋轉(zhuǎn) 平移和投影等等
頂點(diǎn)著色器會(huì)對(duì)每個(gè)頂點(diǎn)數(shù)據(jù)都并行執(zhí)行一次 在運(yùn)算過(guò)程中無(wú)法訪 問(wèn)別的頂點(diǎn)的數(shù)據(jù)
片元著色器FragmentShader
一般來(lái)處理圖像中每個(gè)像素點(diǎn)的顏色計(jì)算和填充
對(duì)每一個(gè)像素點(diǎn) 一個(gè)一個(gè)的并行計(jì)算
GLSL OpenGL shading language
OpenGL 著色語(yǔ)言 開(kāi)發(fā)者自定義的程序 代替了固定的渲染管線的一部分
GLSL的著色器代碼包含頂點(diǎn)著色器和片段著色器兩個(gè)部分
光柵化 Rasterization
將頂點(diǎn)數(shù)據(jù) 轉(zhuǎn)換成片元的過(guò)程 具有將圖轉(zhuǎn)化為一個(gè)個(gè)柵格組成的圖象的作用兜粘,特點(diǎn)是每個(gè)元素對(duì)應(yīng)幀緩沖區(qū)中的一像素绞绒。
1 決定窗口坐標(biāo)中那些整形柵格區(qū)域被基本圖元占用
2 分配一個(gè)顏色值和深度值到各個(gè)區(qū)域
紋理
紋理可以理解為圖? ?家在渲染圖形時(shí)需要在其編碼填充圖?,為了使得 場(chǎng)景更加逼真.?而這里使用的圖?,就是常說(shuō)的紋理.但是在OpenGL,我們更加 習(xí)慣叫紋理,?不是圖?.
混合
在測(cè)試階段之后拦耐,如果像素依然沒(méi)有被剔除耕腾,那么像素的顏色將會(huì)和幀緩沖區(qū)中顏?附著上的顏色進(jìn)行混合
變換矩陣 Transformation
圖形的平移 縮放 旋轉(zhuǎn)變換 需要使用變換矩陣
投影矩陣 projection
用于將3D坐標(biāo)變成二維屏幕的坐標(biāo) 實(shí)際的線條也將在二維坐標(biāo)中進(jìn)行繪制
渲染上屏/交換緩沖區(qū)(SwapBuffer)
渲染緩沖區(qū) 一般映射的是系統(tǒng)的資源 比如窗口 將圖像直接渲染到窗口對(duì)應(yīng)的渲染緩沖區(qū) 可以將圖像顯示到屏幕
如果窗口只有一個(gè)緩沖區(qū) 在繪制的過(guò)程中 可能顯示不出完整的圖像
為了解決這個(gè)問(wèn)題 常規(guī)的OpenGL程序至少有兩個(gè)緩沖區(qū) 顯示在屏幕上的成為屏幕緩沖區(qū) 沒(méi)有顯示在屏幕上的稱為離屏緩沖區(qū) 一個(gè)緩沖區(qū)渲染完成后 將屏幕緩沖區(qū)和離屏緩沖區(qū)交換 來(lái)實(shí)現(xiàn)屏幕上的顯示
OpenGL 坐標(biāo)變換
物體坐標(biāo)/對(duì)象坐標(biāo)——>模型變換——>世界坐標(biāo)——>視變換——>觀察者坐標(biāo)/攝像機(jī)坐標(biāo)——>投影變換——>裁剪變換——>透視除法——>規(guī)范化設(shè)備坐標(biāo)——>視口變換——>屏幕坐標(biāo)
著色器渲染流程
頂點(diǎn)數(shù)據(jù)——>頂點(diǎn)著色器——>細(xì)分著色器——>幾何著色器——>圖元設(shè)置——>剪切——>光柵化——>片元著色器——>效果