在OpenGL 中,不管是使用可編程管線還是固定管線,它的渲染架構(gòu)都是由兩部分組成:Client 和 Server。

在這個圖中,管線分為上下兩部分,上部分是客戶端,下半部分是服務(wù)端。
客戶端(Client): 在CPU上所存儲的一些代碼,比如C/C++ 代碼,OpenGL API 等。
服務(wù)端(Server):調(diào)用GPU 芯片,把客戶端的代碼傳遞到服務(wù)端進(jìn)行處理。
- 客戶端是存儲在CPU存儲器中的,并且在應(yīng)用程序中執(zhí)行,或者在主系統(tǒng)內(nèi)存的驅(qū)動程序中執(zhí)行。驅(qū)動程序會將渲染命令和數(shù)組組合起來,發(fā)送給服務(wù)器執(zhí)行。(在一臺典型的個人計算機(jī)上,服務(wù)器實際上就是圖形加速卡上的硬件和內(nèi)存)
- 服務(wù)器和客戶端在功能上也是異步的。它們是各自獨立的軟件塊或硬件塊。我們希望它們2個端都盡量在不停的工作??蛻舳瞬粩嗟陌褦?shù)據(jù)塊和命令塊組合在一起輸送到緩沖區(qū),然后緩沖區(qū)就會發(fā)送到服務(wù)器執(zhí)行。
- 如果服務(wù)器停止工作等待客戶端,或者客戶端停止工作來等待服務(wù)器做好接受更多的命令和準(zhǔn)備,我們把這種情況稱為管線停滯。
在這之前,必須先為著色器提供數(shù)據(jù)才可以繼續(xù)后續(xù)渲染流程,向OpenGL 著色器傳遞渲染數(shù)據(jù)的方法有三種,屬性(Attribute),Uniform值,紋理數(shù)據(jù)(Texture Data)。
-
屬性
屬性表示經(jīng)常要發(fā)生改變的,比如對每一個頂點都要作改變的數(shù)據(jù)元素。實際上,頂點位置本身就是一個屬性。屬性值可以是浮點數(shù)、整數(shù)、布爾數(shù)據(jù)。屬性還可以是紋理坐標(biāo)、顏色值、位移或者光照法線等。屬性會從本地客戶端內(nèi)存中復(fù)制存儲在圖形硬件中的一個緩沖區(qū)上。這些屬性只提供給頂點著色器使用,對于片元著色器并沒有太大意義。
注意:屬性和Uniform值可以直接傳給頂點著色器(Vertex Shader),屬性不能直接傳遞給片元著色器(Fragment Shader),但是可以通過頂點著色器傳遞到片元著色器里面。
Uniform 值
Uniform 值是一種對整個批次屬性都取統(tǒng)一值的單一值,它一般是不變的。Uniform 值可以直接傳遞給頂點著色器和片元著色器。uniform 值最常見的應(yīng)用是在頂點渲染中設(shè)置變換矩陣。uniform 值還可以是標(biāo)量類型、矢量類型或者uniform 矩陣等。Uniform 值實際上可以無數(shù)次地使用,設(shè)置一個應(yīng)用于整個表面的單個顏色值,還可以設(shè)置一個時間值。在每次渲染某種類型的頂點動畫時修改它。Uniform值是每個批次改變一次,而不是每個頂點改變一次。-
紋理
在頂點著色器、片段著色器中都可以對紋理數(shù)據(jù)進(jìn)行采樣和篩選。不過大多數(shù)情況下把紋理數(shù)據(jù)傳給頂點著色器其實是沒有必要的,因為頂點著色器并不處理太多關(guān)于紋理數(shù)據(jù)的計算。典型的應(yīng)用場景:片段著色器對一個紋理值進(jìn)行采樣,然后在一個三角形表面應(yīng)用渲染紋理數(shù)據(jù)。
紋理數(shù)據(jù),不僅僅表現(xiàn)在圖形,很多圖形文件格式都是以無符號字節(jié)(每個顏色通道8位)形式對顏色分量進(jìn)行存儲的。