在OpenGL 中凶朗,不管是使用可編程管線還是固定管線铝噩,它的渲染架構都是由兩部分組成:Client 和 Server。
在這個圖中泪喊,管線分為上下兩部分棕硫,上部分是客戶端,下半部分是服務端袒啼。
客戶端(Client): 在CPU上所存儲的一些代碼饲帅,比如C/C++ 代碼,OpenGL API 等瘤泪。
服務端(Server):調用GPU 芯片灶泵,把客戶端的代碼傳遞到服務端進行處理。
- 客戶端是存儲在CPU存儲器中的对途,并且在應用程序中執(zhí)行赦邻,或者在主系統(tǒng)內存的驅動程序中執(zhí)行。驅動程序會將渲染命令和數(shù)組組合起來实檀,發(fā)送給服務器執(zhí)行惶洲。(在一臺典型的個人計算機上,服務器實際上就是圖形加速卡上的硬件和內存)
- 服務器和客戶端在功能上也是異步的膳犹。它們是各自獨立的軟件塊或硬件塊恬吕。我們希望它們2個端都盡量在不停的工作⌒氪玻客戶端不斷的把數(shù)據(jù)塊和命令塊組合在一起輸送到緩沖區(qū)铐料,然后緩沖區(qū)就會發(fā)送到服務器執(zhí)行。
- 如果服務器停止工作等待客戶端豺旬,或者客戶端停止工作來等待服務器做好接受更多的命令和準備钠惩,我們把這種情況稱為管線停滯。
在這之前族阅,必須先為著色器提供數(shù)據(jù)才可以繼續(xù)后續(xù)渲染流程篓跛,向OpenGL 著色器傳遞渲染數(shù)據(jù)的方法有三種,屬性(Attribute)坦刀,Uniform值愧沟,紋理數(shù)據(jù)(Texture Data)蔬咬。
-
屬性
屬性表示經(jīng)常要發(fā)生改變的,比如對每一個頂點都要作改變的數(shù)據(jù)元素沐寺。實際上计盒,頂點位置本身就是一個屬性。屬性值可以是浮點數(shù)芽丹、整數(shù)、布爾數(shù)據(jù)卜朗。屬性還可以是紋理坐標拔第、顏色值、位移或者光照法線等场钉。屬性會從本地客戶端內存中復制存儲在圖形硬件中的一個緩沖區(qū)上蚊俺。這些屬性只提供給頂點著色器使用,對于片元著色器并沒有太大意義逛万。
注意:屬性和Uniform值可以直接傳給頂點著色器(Vertex Shader)泳猬,屬性不能直接傳遞給片元著色器(Fragment Shader),但是可以通過頂點著色器傳遞到片元著色器里面宇植。
Uniform 值
Uniform 值是一種對整個批次屬性都取統(tǒng)一值的單一值得封,它一般是不變的。Uniform 值可以直接傳遞給頂點著色器和片元著色器指郁。uniform 值最常見的應用是在頂點渲染中設置變換矩陣忙上。uniform 值還可以是標量類型、矢量類型或者uniform 矩陣等闲坎。Uniform 值實際上可以無數(shù)次地使用疫粥,設置一個應用于整個表面的單個顏色值,還可以設置一個時間值腰懂。在每次渲染某種類型的頂點動畫時修改它梗逮。Uniform值是每個批次改變一次,而不是每個頂點改變一次绣溜。-
紋理
在頂點著色器慷彤、片段著色器中都可以對紋理數(shù)據(jù)進行采樣和篩選。不過大多數(shù)情況下把紋理數(shù)據(jù)傳給頂點著色器其實是沒有必要的怖喻,因為頂點著色器并不處理太多關于紋理數(shù)據(jù)的計算瞬欧。典型的應用場景:片段著色器對一個紋理值進行采樣,然后在一個三角形表面應用渲染紋理數(shù)據(jù)罢防。
紋理數(shù)據(jù)艘虎,不僅僅表現(xiàn)在圖形,很多圖形文件格式都是以無符號字節(jié)(每個顏色通道8位)形式對顏色分量進行存儲的咒吐。