OpenGL專有名詞學習

如下圖所示是OpenGL的一個典型應用場景


OpenGL典型應用場景

設備驅(qū)動程序使用OpenGL指令集向圖像硬件發(fā)出命令,硬件收到后,將內(nèi)容顯示在屏幕上.
OpenGL是一個C風格的圖形庫,沒有類和對象的概念,只有大量的函數(shù).想要對OpenGL有更深的了解,首先要了解一下OpenGL的一些專有名詞.

OpenGL狀態(tài)機

OpenGL自身是一個巨大的狀態(tài)機,可以類比面向?qū)ο缶幊讨幸粋€對象在其生命周期開始到結(jié)束過程中對象的變化.
狀態(tài)機描述了一個對象在其生命周期內(nèi)所經(jīng)歷的各種狀態(tài),狀態(tài)間的轉(zhuǎn)變,發(fā)生轉(zhuǎn)變的動因、條件及轉(zhuǎn)變中所執(zhí)行的活動.它具有以下特定
1 有記憶功能,能記住其當前的狀態(tài) (如當前使用的顏色、是否開啟混合功能等)
2 可以接受輸入,根據(jù)輸入的內(nèi)容和自己的原先狀態(tài),修改自己當前狀態(tài),并且可以有對應的輸出
3 當進入特殊狀態(tài)(停機狀態(tài))的時候,便不再接受輸入,停止工作

OpenGL上下文

OpenGL上下文很好的展示了OpenGL狀態(tài)機的特性.在應用程序調(diào)用任何OpenGL的指令之前,首先會創(chuàng)建一個OpenGL的上下文,這個上下文就是一個非常龐大的狀態(tài)機.保存OpenGL中的各種狀態(tài),
OpenGL函數(shù)的操作,本質(zhì)上都是對OpenGL上下文這個龐大的狀態(tài)機中的某個狀態(tài)或者對象進行操作,因此通過對OpenGL指令的封裝,可以將OpenGL的相關調(diào)用封裝成為一個面向?qū)ο蟮膱D形API.
由于OpenGL狀態(tài)機非常巨大,所以切換上下文往往會產(chǎn)生較大的開銷,但是不同的繪制模塊,可能需要使用完全獨立的狀態(tài)管理.因此,可以在應用程序中分別創(chuàng)建多個不同的上下文,在不同線程中使用不同的上下文,上下文之間共享紋理、緩沖區(qū)等資源.

幀緩沖區(qū)

幀緩存不是一片緩存,可以把它當成一個抽象概念.它有scissor、alpha、stencil、depth這些緩存組合,在圖像進行輸出時,它相當于OpenGL中的畫板,結(jié)合畫布(可以是紋理或渲染緩沖區(qū))將圖像進行展示處理,放置這些畫布的位置被稱為幀緩沖區(qū)的附著

附著

幀緩沖區(qū)可以分為三種類型的附著:顏色附著、深度附著、模板附著.而這三種附著對應的存儲區(qū)域被稱為顏色、深度、模板緩沖區(qū).顏色附著輸出繪制圖像的顏色數(shù)據(jù),深度附著輸出繪制圖像的深度數(shù)據(jù),模板附著輸出模板數(shù)據(jù)

渲染

將圖形/圖像數(shù)據(jù)轉(zhuǎn)換成3D空間圖像的操作

頂點數(shù)組和頂點緩沖區(qū)

頂點數(shù)組 : 用來存儲圖形的頂點數(shù)據(jù)的數(shù)組,存儲在內(nèi)存當中.
頂點緩沖區(qū) : 在調(diào)用繪制方法時候,為提高性能,提前分配一塊內(nèi)存,將頂點數(shù)據(jù)預先傳入到顯存當中,這部分顯存,就被稱為頂點緩沖區(qū).

渲染管線

也成為渲染流水線/像素流水線/像素管線,是顯示芯片內(nèi)部處理圖形信號相互獨立的并行處理單元,是GPU的重要組成部分.一個流水線是一序列可以并行和按照固定順序進行的階段.每個階段都從他的前一階段接受收入,然后把輸出發(fā)給隨后的階段.渲染管線大致分為頂點變換、圖元裝配、光柵化、插值、貼圖、著色、光柵化幾個階段.渲染管線的數(shù)量是決定顯示芯片性能和檔次的最重要的參數(shù)之一,一般是以像素渲染流水線的數(shù)量×每管線的紋理單元數(shù)量來表示,一般來說在相同的顯示核心架構(gòu)下,渲染管線越多也就意味著性能越高

固定管線/存儲著色器

早期的OpenGL版本中封裝了內(nèi)置了光照、坐標變換、裁剪等諸多功能的多種著色器程序塊.開發(fā)者進行圖形渲染圖形時,只需要傳入相應的參數(shù)就可以實現(xiàn)功能,不需要關心底層的實現(xiàn)原理.但隨著使用場景的豐富,固定管線或存儲著色器無法完成每一個業(yè)務,這時將相關部分開發(fā)成可編程.

著色器程序

將固定渲染管線架構(gòu)變成可編程渲染管線.OpenGL在實際調(diào)用繪制函數(shù)之前,還需要指定一個由著色器編譯成的著色器程序.OpenGL在處理著色器時,和其他編譯器一樣,通過編譯、鏈接等步驟,生成著色器程序,著色器程序同時包含了頂點著色器和片段著色器的運算邏輯.在OpenGL進行繪制的時候,首先由頂點著色器對傳入的頂點數(shù)據(jù)進行運算.再通過圖元裝配,將頂點轉(zhuǎn)換為圖元.然后進行光柵化,將圖元這種矢量圖形,轉(zhuǎn)換為柵格化數(shù)據(jù).最后,將柵格化數(shù)據(jù)傳入片段著色器中進行運算.片段著色器會對柵格化數(shù)據(jù)中的每個像素進行運算,并決定像素的顏色
常見的著色器有 頂點著色器、片段著色器/像素著色器、集合著色器、曲面細分著色器.

頂點著色器

著色器程序--描述頂點上執(zhí)行操作的頂點著色器程序源代碼/可執(zhí)行文件.
頂點著色器是OpenGL中用于計算頂點屬性的程序.頂點著色器是逐頂點運算的程序,也就是說每個頂點數(shù)據(jù)都會執(zhí)行一次頂點著色器,當然這是并行的,并且頂點著色器運算過程中無法訪問其他頂點的數(shù)據(jù)
一般來說典型的需要計算的頂點屬性主要包括處理圖形每個頂點矩陣變換: 旋轉(zhuǎn)/平移/投影等、計算光照公式生成逐頂點顏色、生成/變換紋理坐標,頂點坐標由自身坐標系轉(zhuǎn)換到歸一化坐標系的運算,也是在這里發(fā)生的

片元著色器程序

一般用于處理圖形中每個像素點顏色的計算和填充
片段著色器是OpenGL中用于計算片段(像素)顏色的程序.片段著色器是逐像素運算的程序.也就是說每一個像素都會執(zhí)行一次片段著色器,當然也是并行的

GLSL OpenGL Shading Language

OpenGL著色器語言是用來在OpenGL中著色編程的語言,也即開發(fā)人員寫的短小的自定義程序,他們是在圖形卡的GPU上執(zhí)行,代替了固定的渲染管線的一部分,使渲染管線中不同層次具有可編程性.比如: 視圖轉(zhuǎn)換、投影轉(zhuǎn)換.

光柵化

是吧頂點數(shù)據(jù)轉(zhuǎn)化為片元的過程,具有將圖轉(zhuǎn)化為一個個柵格組成的圖像的作用,特點是每個元素對應幀緩沖區(qū)中的一像素
光柵化其實是一種將集合圖元變?yōu)槎S圖像的過程.該過程包含兩部分工作.第一部分工作:決定窗口坐標中的哪些整形柵格區(qū)域被基本圖元占用;第二部分工作:分配一個顏色值和一個深度值到各個區(qū)域.片元在光柵化過程產(chǎn)生
把物體的數(shù)學描述以及與物體相關的顏色信息轉(zhuǎn)換為屏幕上用于對應位置的像素及用于填充像素的顏色,這個過程稱為光柵化,就是將模擬信號轉(zhuǎn)化為離散信號的過程

紋理

紋理可以理解為圖片,大家在渲染圖像時需要在其編碼填充圖片,為了使得場景更加逼真.而這里使用的而圖片就是常說的紋理

混合

在測試階段之后,如果像素依然沒有被提出,那么像素的顏色將會和幀緩沖區(qū)顏色附著上的顏色進行混合,混合的算法可以通過OpenGL的函數(shù)進行指定.但是OpenGL提供的混合算法是有限的,如果需要更加復雜的混合算法,一般可以通過像素著色器進行實現(xiàn),當然性能會比原生的混合算法差一些

變換矩陣

圖形想發(fā)生平移 縮放 旋轉(zhuǎn)變換,就需要使用變換矩陣

矩陣投影

用于將3D坐標轉(zhuǎn)換為二維屏幕坐標,實際線條也將在二維坐標下進行繪制

渲染上屏/交換緩沖區(qū)

渲染緩沖區(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)充分利用硬件性能的目的

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容