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é)議微饥,通過(guò)共享網(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ī)的核心處理器中(不過(guò)依然是獨(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í)艺配,只可以通過(guò)三種管道進(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
通過(guò)設(shè)置Uniform 變量就緊接著發(fā)送一個(gè)圖元批次處理命令娜氏。用 Uniforms 修飾的變量在執(zhí)行一次 Shader 文件中拳缠,是不會(huì)發(fā)生改變的,它的改變只有通過(guò)下次進(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ù)的大型查詢表)都可以通過(guò)這種方式傳遞給著色器。
- 在頂點(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ù)處理過(guò)程雕沿,并且將應(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í)行杈女。