不少0基礎的人在看OpenGL相關的書籍的時候都會以爲雲裏霧裏,很難,這是由於OpenGL中有不少使人費解的專業術語,因此想要入門OpenGL理解這些專業術語是頗有必要的。下面咱們一塊兒來理解一下這些煩人的傢伙.編碼
狀態機是一種理論上的機器,它具備一下特色:spa
怎麼樣,是否是很懵逼,很難理解。你們能夠把它想象成一個相似手機或者電腦的機器,好比電腦有本身的磁盤,內存等存儲了安裝的全部應用程序和其餘文件,這些就是電腦當前的狀態;電腦有鼠標鍵盤等能夠輸入各類信息,並可以根據輸入修改存儲在電腦上的文件 以及安裝的程序等等,還能夠經過顯示屏輸出相應的信息;當電腦關機後就不能接收任何輸入了。怎麼樣是否是和恰好知足狀態機的全部特色,全部爲了幫助理解你們徹底能夠把狀態機理解爲一臺和電腦很類似的機器。
類推到OpenGL中,對應OpenGL狀態機咱們能夠這麼理解:
OpenGL狀態機保持自身的狀態,除非用戶輸入一條命令讓它改變狀態
在應用程序調用任何OpenGL的指令以前,須要首先建立一個OpenGL的上下文。這個上下文是一個很是龐大的狀態機,它保存了OpenGL中的各類狀態,這也是OpenGL指令執行的基礎
OpenGL的函數不管在哪一個語言中,都是相似C語言同樣的⾯向過程的函數,本質上都是對OpenGL上下文這個龐大的狀態機中的某個狀態或者對象進行操做,固然你得首先把這個對象設置爲當前對象。所以,經過對 OpenGL指令的封裝,是能夠將OpenGL的相關調用封裝成爲一個⾯向對象的圖形API的
因爲OpenGL上下文是一個巨大的狀態機,切換上下⽂每每會產生較大的開銷,可是不同的繪製模塊,可能須要使用徹底獨立的狀態管理。所以,能夠在應用程序中分別建立多個不同的上下文,在不同線程中使用不同的上下文,上下文之間共享紋理、緩衝區等資源。這樣的⽅案,會比反覆切換 上下文,或者大量修改渲染狀態,更加合理高效
頂點指的是圖形的頂點位置數據(在3D笛卡爾座標中即x,y,z座標)這些數據能夠直接存到內存數組中,這個數組就叫作頂點數組。爲提供性能也能夠提早分配一塊顯存,將這些頂點數據提早存到顯存當中,這一塊顯存就叫作頂點緩衝區。
在OpenGL下渲染圖形,就會經歷一個個節點.而這樣的操做能夠理解爲管線.你們能夠想象成流水線.每一個任務相似流水線般執行.任務之間有前後順序. 管線是一個抽象的概念,之因此稱之爲管線是由於顯卡在處理理數據的時候是按照 一個固定的順序來的,並且嚴格按照這個順序。就像水從一根管子的一端流到另外一端,這個順序是不能打破的 。
先說一下什麼是着色器,簡單的理解着色器就能夠理解爲一個具備特定功能的函數,包含了光照、座標變換,裁剪等等功能。
早期的OpenGL版本封裝了不少這樣的着色器來幫助開發者完成圖形渲染,而開發者只須要傳入相應的參數,就能快速完成圖形的渲染. 相似於iOS開發會封裝不少API,而咱們只須要調用,就能夠實現功能.不須要關注底層實現原理。這些被封裝好的,不能被修改的固定的着色器或者說固定的函數 就是固定管線也稱爲存儲着色器。
可是因爲OpenGL的使用場景很是豐富,固定管線或存儲着色器沒法完成每個業務.這時將相關部分開放成可編程的,便可編程着色器。由此就全⾯將固定渲染管線架構變爲了可編程渲染管線。所以,OpenGL在實際調用繪製函數以前,還須要指定一個由shader編譯成的着色器器程序。常見的着色器主要有頂點着色器(VertexShader),片斷着色器 (FragmentShader)/像素着色器(PixelShader),⼏何着色器 (GeometryShader),曲面細分着色器(TessellationShader)。片斷着色器和像素着色器只是在OpenGL和DX中的不一樣叫法而已。惋惜的是,直到 OpenGLES 3.0,依然只支持了頂點着色器和⽚段着色器這兩個最基礎的着色器。
OpenGL在處理Shader時,和其餘編譯器同樣。經過編譯、連接等步驟,生成了着⾊器程序(glProgram),着⾊器程序同時包含了頂點着⾊器和⽚段着⾊器的運算邏輯。在OpenGL進行繪製的時候,⾸先由頂點着⾊器對傳⼊的頂點數據進行運算。再經過圖元裝配,將頂點轉換爲圖元。而後進行光柵化,將圖元這種⽮量圖形,轉換爲柵格化數據。最後,將柵格化數據傳入⽚段着⾊器中進行運算。⽚段着色器會對柵格化數據中的每⼀個像素進行運算,並決定像素的顏⾊。
頂點着色器通常用來處理圖形每一個頂點的變換(平移、旋轉、投影等)
頂點着⾊器是OpenGL中⽤於計算頂點屬性的程序。頂點着色器是逐頂點運算的程序,也就是說每一個頂點數據都會執行⼀次頂點着⾊器,固然這是並行的,而且頂點着⾊器運算過程當中⽆沒法訪問其餘頂點的數據
通常來講典型的須要計算的頂點屬性主要包括頂點座標變換、逐頂點光照運算等等。頂點座標由⾃身座標系轉換到歸一化座標系的運算,就是在這里發⽣的。
片元着色器通常⽤來處理圖形中每一個像素點顏⾊計算和填充 。片元着色器又叫片斷着色器,在DX中又叫像素着色器,因此這三個概念其實是等價的。
片斷着⾊器是OpenGL中⽤於計算⽚段(像素)顏色的程序。片斷着⾊器是逐像素運算的程序,也就是說每一個像素都會執行⼀次片斷着⾊器,固然也是並行的 。
OpenGL着⾊語言(OpenGL Shading Language)是⽤來在OpenGL中着⾊編程的語言,也即開發⼈員寫的短小的⾃定義程序,他們是在圖形卡的GPU (Graphic Processor Unit圖形處理單元)上執行的,代替了固定渲染管線的一部分,使渲染管線中不一樣層次具備可編程性。⽐如:視圖轉換、投影轉換等。GLSL(GL Shading Language)的着⾊器代碼分紅2個部分: Vertex Shader(頂點着⾊器)和Fragment(⽚斷着色器)
光柵化是把頂點數據轉換爲片元的過程,具備將圖轉化爲⼀個個柵格組成的圖象的做用,特色是片元中的每一個元素對應幀緩衝區中的一像素 。
光柵化實際上是一種將幾何圖元變爲二維圖像的過程。該過程包含了兩部分的工做。第一部分工做:決定窗⼝座標中的哪些整型柵格區域被基本圖元佔用;第二部分工做:分配一個顏色值和⼀一個深度值到各個區域。光柵化過程產⽣的是片元 。
把物體的數學描述以及與物體相關的顏⾊信息轉換爲屏幕上用於對應位置的像素及用於填充像素的顏色,這個過程稱爲光柵化,這是一個將模擬信號轉化爲離散信號的過程 。
紋理能夠理解爲圖片. 你們在渲染圖形時須要在其編碼填充圖片,爲了使得場景更加逼真.而這里使用的圖片,就是常說的紋理.可是在OpenGL中,咱們更加習慣叫紋理,⽽不是圖片.
在測試階段以後,若是像素依然沒有被剔除,那麼像素的顏色將會和幀緩衝區中顏色附着上的顏⾊進⾏混合,混合的算法能夠經過OpenGL的函數進行指定。可是OpenGL提供的混合算法是有限的,若是須要更加複雜的混合算法,通常能夠經過像素着色器進行實現,固然性能會⽐比原⽣的混合算法差一些.