OpenGL 渲染架構(gòu)
OpenGL是使用客戶端(Client)- 服務(wù)器(Server)的形式實(shí)現(xiàn)的,我們編寫的應(yīng)用程序可以看做客戶端,而計(jì)算機(jī)圖形硬件廠商說(shuō)提供的 OpenGL 實(shí)現(xiàn)可以看做服務(wù)端。OpenGL 的某些實(shí)現(xiàn)(例如 X 窗口系統(tǒng)的實(shí)現(xiàn))運(yùn)行服務(wù)端和客戶端在一個(gè)網(wǎng)絡(luò)內(nèi)的不同計(jì)算機(jī)上運(yùn)行。這種情況下,客戶端負(fù)責(zé)提交 OpenGL 命令,這些 OpenGL 命令然后被轉(zhuǎn)換為窗口系統(tǒng)相關(guān)的協(xié)議,通過共享網(wǎng)絡(luò)傳輸?shù)椒?wù)端,服務(wù)端最終執(zhí)行并產(chǎn)生圖像內(nèi)容。
在大多數(shù)現(xiàn)代的實(shí)現(xiàn)方案中,硬件圖形加速器(GPU)被用來(lái)完成大部分的 OpenGL 指令,它往往被構(gòu)建在計(jì)算機(jī)的核心處理器中(不過依然是獨(dú)立的部件),或者作為一個(gè)獨(dú)立的電路板被插到計(jì)算機(jī)主板上。無(wú)論哪種安裝方式,我們都應(yīng)當(dāng)把圖形加速器作為服務(wù)端,把用戶程序作為客戶端來(lái)看待。

客戶端 為OpenGL API和調(diào)用API的不同語(yǔ)言代碼,在CPU中執(zhí)行的。
服務(wù)端 為GPU硬件部分,主要由Vertex Shader、Primitive Assembly、Fragment Shader組成。
客戶端在向服務(wù)端傳遞數(shù)據(jù)時(shí),只可以通過三種管道進(jìn)行數(shù)據(jù)傳輸:
- Attributes,
- Uniforms,
- Texture Data,
他們只是傳輸數(shù)據(jù)的管道,并不是具體的數(shù)據(jù)類型,用來(lái)修飾具體變量的傳輸方式。
1. Attributes
就是對(duì)?個(gè)頂點(diǎn)都要作出改變的數(shù)據(jù)元素。通俗來(lái)講,用來(lái)修飾在 Shader 文件中會(huì)修改的變量,如頂點(diǎn)數(shù)據(jù),紋理坐標(biāo),顏色色值等。
這些屬性對(duì)每個(gè)頂點(diǎn)都要做改變,但并不意味著它們的值不能重復(fù)。通常情況下,它們都是不一樣的,但有可能整個(gè)數(shù)組都是同一值的情況。
2. Uniforms
通過設(shè)置Uniform 變量就緊接著發(fā)送一個(gè)圖元批次處理命令。用 Uniforms 修飾的變量在執(zhí)行一次 Shader 文件中,是不會(huì)發(fā)生改變的,它的改變只有通過下次進(jìn)行圖元處理時(shí),從外部再次傳輸。
- 與Attributes相同點(diǎn):可以是浮點(diǎn)值、整數(shù)、布爾值
- 與Attributes不同點(diǎn):Vertex Shader和 Fragment Shader 都可以使用 uniform 變量。uniform 變量還可以是標(biāo)量類型、?量類型、uniform 矩陣。
3. Texture Data
Texture Data用來(lái)傳輸紋理數(shù)據(jù),對(duì)紋理進(jìn)行采樣和篩選。
紋理數(shù)據(jù)的作用不僅僅是表現(xiàn)圖形。很多圖形文件格式都是以無(wú)符號(hào)字節(jié)形式對(duì)顏色分量進(jìn)行存儲(chǔ)的,但我們?nèi)匀豢梢栽O(shè)置浮點(diǎn)紋理。這就是說(shuō),任何大型浮點(diǎn)數(shù)據(jù)塊(例如消耗資源很大的函數(shù)的大型查詢表)都可以通過這種方式傳遞給著色器。
- 在頂點(diǎn)著?器、?元著?器中都可以對(duì)紋理數(shù)據(jù)進(jìn)行采樣和篩選。
- 紋理數(shù)據(jù),不僅僅表現(xiàn)在圖形,很多圖形?件格式都是以?符號(hào)字節(jié) (每個(gè)顏?通道8位)形式對(duì)顏色分量進(jìn)?存儲(chǔ)的。
in/out:OpenGL 定義了 in 變量將數(shù)據(jù)拷貝到著色器中,out 變量將著色器中的內(nèi)容拷貝出去。
OpenGL 渲染管線
OpenGL 實(shí)現(xiàn)了我們通常所說(shuō)的渲染管線(rendering pipeline),它是一系列數(shù)據(jù)處理過程,并且將應(yīng)用程序的數(shù)據(jù)轉(zhuǎn)換到最終渲染的圖像。
OpenGL 首先接受用戶提供的幾何數(shù)據(jù)(頂點(diǎn)和幾何圖元),并且將它傳輸?shù)揭幌盗兄麟A段中進(jìn)行處理,這些階段包括頂點(diǎn)著色,細(xì)分著色(它包含兩個(gè)著色器:細(xì)分控制著色器,細(xì)分計(jì)算著色器),以及最后的幾何著色,然后他將被送入光柵化單元(rasterizer)。光柵化單元負(fù)責(zé)對(duì)所有的剪切區(qū)域(clopping region)內(nèi)的圖元生成片元數(shù)據(jù),然后對(duì)每個(gè)生成的片元都執(zhí)行。
