一.OpenGL簡介
OpenGL(英語:Open Graphics Library,譯名:開放圖形庫或者“開放式圖形庫”)是用于渲染2D、3D矢量圖形的跨語言、跨平臺的應用程序編程接口(API)。它將計算機的資源抽象稱為?個個OpenGL的對象,對這些資源的操作抽象為?個個的OpenGL指令,開發(fā)者可以在mac程序中使用OpenGl來實現(xiàn)圖形渲染。圖形API的目的就是實現(xiàn)圖形的底層渲染,比如游戲場景/游戲人物的渲染,音視頻解碼后數(shù)據(jù)的渲染,地圖上的渲染,動畫繪制等。在iOS開發(fā)中,開發(fā)者唯一能夠GPU的就是圖形API。(GPU---圖形處理器(英語:Graphics Processing Unit,縮寫:GPU),又稱顯示核心、視覺處理器、顯示芯片,是一種專門在個人電腦、工作站、游戲機和一些移動設備(如平板電腦、智能手機等)上做圖像和圖形相關運算工作的微處理器。)
二.OpenGL專業(yè)名詞解析
? ? 1.OpenGL?上下?( context )
? ??????OpenGL Context,中文解釋就是OpenGL的上下文,因為OpenGL沒有窗口的支持,我們在使用OpenGl的時候,一般是在main函數(shù)創(chuàng)建窗口:?
????????//GLUT窗口大小、窗口標題
????????glutInitWindowSize(800, 600);
????????glutCreateWindow("Triangle");
? ? ????然后我們在創(chuàng)建的窗口里面繪制,個人理解上下文的意思就是指的是OpenGL的作用范圍,當然OpenGL的Context不只是這個窗口,這個窗口我們可以理解為OpenGL的default framebuffer,所以Context還包含關于這個framebuffer的一些參數(shù)設置信息,具體內(nèi)容可以查看OpenGL的Context的結構體,Context記錄了OpenGL渲染需要的所有信息,它是一個大的結構體,它里面記錄了當前繪制使用的顏色、是否有光照計算以及開啟的光源等非常多我們使用OpenGL函數(shù)調(diào)用設置的狀態(tài)和狀態(tài)屬性等等,你可以把它理解為是一個巨大的狀態(tài)機,它里面保存OpenGl的指令,在圖形渲染的時候,可以理解為這個狀態(tài)機開始工作了,對某個屬性或者開關發(fā)出指令。它的特點就是:有記憶功能,接收輸入,根據(jù)輸入的指令,修改當前的狀態(tài),并且可以輸出內(nèi)容,當停機的時候不再接收指令。
2.渲染
? ? ? ? 渲染就是把數(shù)據(jù)顯示到屏幕上,在OpenGl中,渲染指的是將圖形/圖像數(shù)據(jù)轉換為2D空間圖像操作叫渲染
3.頂點數(shù)組/頂點緩沖區(qū)
? ? ? ? 在OpenGL中,基本圖元有三種:點,線,三角形,復雜的圖形由這三種圖元組成,我們在畫點/線/三角形的時候是不是應該先知道每個頂點的坐標,而這些坐標放在數(shù)組里,就叫頂點數(shù)組。頂點數(shù)組存在內(nèi)存當中,但是為了提高性能,提前分配一塊顯存,將頂點數(shù)組預先存入到顯存當中,這部分的顯存就叫頂點緩沖區(qū)。
4.著色器(shader)
????????為什么要使用著色器?我們知道,OpenGL一般使用經(jīng)典的固定渲染管線來渲染對象,OpenGL在實際調(diào)?繪制函數(shù)之前,還需指定?個由shader編譯成的著?器程序。常?的著?器主要有頂點著?器(VertexShader),?段著?器(FragmentShader)/像素著?器(PixelShader),?何著?器(GeometryShader),曲?細分著?器(TessellationShader)。?段著?器和像素著?器只是在OpenGL和DX中的不同叫法?已??上У氖牵钡絆penGLES 3.0,依然只?持了頂點著?器和?段著?器這兩個最基礎的著?器。OpenGL在處理shader時,和其他編譯器?樣。通過編譯、鏈接等步驟,?成了著?器程序(glProgram),著?器程序同時包含了頂點著?器和?段著?器的運算邏輯。在OpenGL進?繪制的時候,?先由頂點著?器對傳?的頂點數(shù)據(jù)進?運算。再通過圖元裝配,將頂點轉換為圖元。然后進?光柵化,將圖元這種?量圖形,轉換為柵格化數(shù)據(jù)。最后,將柵格化數(shù)據(jù)傳??段著?器中進?運算。?段著?器會對柵格化數(shù)據(jù)中的每?個像素進?運算,并決定像素的顏?(頂點著色器和片段/片元著色器會在下面講解)
5.管線
? ? ? ? OpenGL在渲染圖形/圖像的時候是按照特定的順序來執(zhí)行的,不能修改打破,管線的意思個人理解是(舉例,不對的地方請大神指點

):讀取頂點數(shù)據(jù)—>頂點著色器—>組裝圖元—>光柵化圖元—>片元著色器—>寫入幀緩沖區(qū)—>顯示到屏幕上,類似這樣的流水線,當圖像/圖形顯示到屏幕上,這一條管線完成工作。下面是分步講解:
? ?????(1)讀取頂點數(shù)據(jù)指的是將待繪制的圖形的頂點數(shù)據(jù)傳遞給渲染管線中。
? ? ????(2)頂點著色器最終生成每個定點的最終位置,執(zhí)行頂點的各種變換,它會針對每個頂點執(zhí)行一次,確定了最終位置后,OpenGL就可以把這些頂點集合按照給定的參數(shù)類型組裝成點,線或者三角形。
? ? ? (3)組裝圖元階段包括兩部分:圖元的組裝和圖元處理,圖元組裝指的是頂點數(shù)據(jù)根據(jù)設置的繪制方式參數(shù)結合成完整的圖元,例如點繪制方式中每個圖元就只包含一個點,線段繪制方式中每個圖源包含兩個點;圖元處理主要是剪裁以使得圖元位于視景體內(nèi)部的部分傳遞到下一個步驟,視景體外部的部分進行剪裁。視景體的概念與投影有關。
? ? ? (4)光柵化圖元主要指的是將一個圖元離散化成可顯示的二維單元片段,這些小單元稱為片元。一個片元對應了屏幕上的一個或多個像素,片元包括了位置,顏色,紋理坐標等信息,這些值是由圖元的頂點信息進行插值計算得到的。
? ? ? (5)片元著色器為每個片元生成最終的顏色,針對每個片元都會執(zhí)行一次。一旦每個片元的顏色確定了,OpenGL就會把它們寫入到幀緩沖區(qū)中。
6.頂點著色器
????????????般?來處理圖形每個頂點變換(旋轉/平移/投影等)?????????????????????
??????????頂點著?器是OpenGL中?于計算頂點屬性的程序。頂點著?器是逐頂點運算的程序,也就是說每個頂點數(shù)據(jù)都會執(zhí)??次頂點著?器,當然這是并?的,并且頂點著?器運算過程中?法訪問其他頂點的數(shù)據(jù)
???????????般來說典型的需要計算的頂點屬性主要包括頂點坐標變換、逐頂點光照運算等等。頂點坐標由?身坐標系轉換到歸?化坐標系的運算,就是在這?發(fā)?的。
7.片元著色器(片段著色器)
? ???????般?來處理圖形中每個像素點顏?計算和填充?段著?器是OpenGL中?于計算?段(像素)顏?的程序。?段著?器是逐像素運算的程序,也就是說每個像素都會執(zhí)??次?段著?器,當然也是并?的
8.光柵化Rasterization?
? ????????是把頂點數(shù)據(jù)轉換為?元的過程,具有將圖轉化為?個個柵格組成的圖象的作?,特點是每個元素對應幀緩沖區(qū)中的?像素。
??????????光柵化就是把頂點數(shù)據(jù)轉換為?元的過程。?元中的每?個元素對應于幀緩沖區(qū)中的?個像素。
??????????光柵化其實是?種將?何圖元變?yōu)?維圖像的過程。該過程包含了兩部分的?作。第?部分?作:決定窗?坐標中的哪些整型柵格區(qū)域被基本圖元占?;第?部分?作:分配?個顏?值和?個深度值到各個區(qū)域。光柵化過程產(chǎn)?的是?元
??????????把物體的數(shù)學描述以及與物體相關的顏?信息轉換為屏幕上?于對應位置的像素及?于填充像素的顏?,這個過程稱為光柵化,這是?個將模擬信號轉化為離散信號的過程
9.紋理
? ??????紋理可以理解為圖?.??家在渲染圖形時需要在其編碼填充圖?,為了使得場景更加逼真.?這?使?的圖?,就是常說的紋理.但是在OpenGL,我們更加習慣叫紋理,?不是圖?
10.混合(Blending)
? ??????在測試階段之后,如果像素依然沒有被剔除,那么像素的顏?將會和幀緩沖區(qū)中顏?附著上的顏?進?混合,混合的算法可以通過OpenGL的函數(shù)進?指定。但是OpenGL提供的混合算法是有限的,如果需要更加復雜的混合算法,?般可以通過像素著?器進?實現(xiàn),當然性能會?原?的混合算法差?些,個人理解有點像iOS給RGB中紅,綠,藍設置不同的值得到不同的顏色,只是這里是操作片元著色器,來達到不同的顯示。
11.變換矩陣(Transformation)/投影矩陣Projection?
? ? ? ? 在iOS核心動畫中我們也會和矩陣打交到,變換矩陣顧名思義就是對圖像/圖形的放大/縮小/平移/選裝等座處理。
????????投影矩陣就是?于將3D坐標轉換為?維屏幕坐標,實際線條也將在?維坐標下進?繪制 ? ?
12.渲染上屏/交換緩沖區(qū)(SwapBuffer)? ? ?
? ????渲染緩沖區(qū)?般映射的是系統(tǒng)的資源?如窗?。如果將圖像直接渲染到窗?對應的渲染緩沖區(qū),則可以將圖像顯示到屏幕上。
??????但是,值得注意的是,如果每個窗?只有?個緩沖區(qū),那么在繪制過程中屏幕進?了刷新,窗?可能顯示出不完整的圖像
??????為了解決這個問題,常規(guī)的OpenGL程序?少都會有兩個緩沖區(qū)。顯示在屏幕上的稱為屏幕緩沖區(qū),沒有顯示的稱為離屏緩沖區(qū)。在?個緩沖區(qū)渲染完成之后,通過將屏幕緩沖區(qū)和離屏緩沖區(qū)交換,實現(xiàn)圖像在屏幕上的顯示。
??????由于顯示器的刷新?般是逐?進?的,因此為了防?交換緩沖區(qū)的時候屏幕上下區(qū)域的圖像分屬于兩個不同的幀,因此交換?般會等待顯示器刷新完成的信號,在顯示器兩次刷新的間隔中進?交換,這個信號就被稱為垂直同步信號,這個技術被稱為垂直同步
??????使?了雙緩沖區(qū)和垂直同步技術之后,由于總是要等待緩沖區(qū)交換之后再進?下?幀的渲染,使得幀率?法完全達到硬件允許的最??平。為了解決這個問題,引?了三緩沖區(qū)技術,在等待垂直同步時,來回交替渲染兩個離屏的緩沖區(qū),?垂直同步發(fā)?時,屏幕緩沖區(qū)和最近渲染完成的離屏緩沖區(qū)交換,實現(xiàn)充分利?硬件性能的?的
13.坐標系
? ? ? OpenGl常見的坐標系有:
????????1. Object or model coordinates(物體或模型坐標系)每一個實物都有自己的坐標系,在高中數(shù)學中,以自身建立的坐標系,自身坐標系由世界坐標系平移而來
????????2. World coordinates(世界坐標系)個人理解為地球相對自己建立的坐標系,地球上所有生物都處于這個坐標系當中
????????3. Eye (or Camera) coordinates(眼(或相機)坐標系)
? ? ? ? 4. Normalized device coordinates(標準化的設備坐標系)
? ? ? ? 5. Window (or screen) coordinates(.窗口(或屏幕)坐標系)個人理解為iOS下
? ? ? ? 6.Clip coordinates(裁剪坐標系)主要作用是當圖形/圖像超出時,按照這個坐標系裁剪,裁剪好之后轉換到screen坐標系
14.正投影/透視投影
? ? ????正投影:類似于照鏡子,1:1形成圖形大小,這里不做重點講解
? ? ? ? 透視投影:在OpenGL中,如果想對模型進行操作,就要對這個模型的狀態(tài)(當前的矩陣)乘上這個操作對應的一個矩陣.如果乘以變換矩陣(平移, 縮放, 旋轉), 那相乘之后, 模型的位置被變換;如果乘以投影矩陣(將3D物體投影到2D平面), 相乘后, 模型的投影方式被設置;如果乘以紋理矩陣(), 模型的紋理方式被設置.而用來指定乘以什么類型的矩陣, 就是glMatriMode(GLenummode);glMatrixMode有3種模式: GL_PROJECTION 投影, GL_MODELVIEW 模型視圖, GL_TEXTURE 紋理.所以,在操作投影矩陣以前,需要調(diào)用函數(shù):glMatrixMode(GL_PROJECTION); //將當前矩陣指定為投影矩陣然后把矩陣設為單位矩陣

最后附上一篇搭建OpenGl的文章:http://m.itdecent.cn/p/43ae1587f45b