前言
前兩篇文章中給大家解析過了什么是OpenGL的一些常用名詞篮奄,掌握一些常用的名詞捆愁,可以更加方便我們后面的學(xué)習(xí)和理解,也方便我們后面在遇到之后更加容易去查找窟却。然后講了著色器的渲染流程昼丑,我們基本上把大致是怎么玩兒的也弄清楚了。那么這一片文章就從OpenGL的渲染架構(gòu)開始夸赫,帶大家聊了解一下OpenGL的渲染架構(gòu)到底是怎么組成的菩帝。
OpenGL渲染架構(gòu)
首先我們來看一張架構(gòu)圖:
解釋一下什么叫做客戶端,什么叫做服務(wù)端:
- 客戶端:我們編寫的代碼茬腿,或者是說調(diào)用的OpenGL的API呼奢,客戶端是存儲在CPU存儲器中的,并且在應(yīng)用程序中執(zhí)行切平,或者再主系統(tǒng)內(nèi)存的驅(qū)動程序中執(zhí)行握础。
- 服務(wù)端:就是計(jì)算機(jī)圖形硬件廠商所提供的OpenGL的實(shí)現(xiàn)。我們編寫的GLSL代碼也是在服務(wù)端去運(yùn)行的悴品,簡單來說就是操作的GPU禀综。
服務(wù)端和客戶端在功能上是異步的简烘,也就是說他們是各自獨(dú)立的軟件塊或者硬件塊,或者軟硬件都有定枷,為了獲得最佳的性能孤澎,我們希望兩方面都盡可能不停地工作∏分希客戶端不斷地將數(shù)據(jù)塊和命令塊組合到一起送到緩沖區(qū)覆旭,然后這些緩沖區(qū)會發(fā)送到服務(wù)端執(zhí)行。服務(wù)端將執(zhí)行這些緩沖區(qū)的內(nèi)容岖妄,與此同時客戶端又做好了發(fā)送下一個用于渲染的數(shù)據(jù)或者信息的準(zhǔn)備姐扮,如果服務(wù)端停止工作等待客戶端,或者客戶端停止了工作來等待服務(wù)端做好接受更多命令和數(shù)據(jù)的準(zhǔn)備衣吠,我們就把這情況稱為管線停滯茶敏。
從上面的圖,我們也能看出缚俏【客戶端只會向服務(wù)端傳遞三種數(shù)據(jù),分別是:
1忧换、屬性值(Attributes)
- 就是一個對每個頂點(diǎn)都要做改變的數(shù)據(jù)元素恬惯。實(shí)際上,頂點(diǎn)位置本身就是一個屬性亚茬。屬性值可以使浮點(diǎn)數(shù)酪耳、整數(shù)或布爾數(shù)據(jù)。
- 屬性總是以四維向量的形式進(jìn)行內(nèi)部存儲的刹缝,即使我們不會使用到所有4個分量碗暗。例如,一個頂點(diǎn)位置可能存儲為一個x值梢夯,一個y值和一個z值言疗,將占用4個分量中的3個。OpenGL會將第4個(w分量)設(shè)為1颂砸。實(shí)際上噪奄,如果我們在二維平面上面繪圖的話,那么第3個分量就會自動設(shè)為0人乓,第4個分量依舊設(shè)為1勤篮。
- 屬性會從本地客戶端內(nèi)存中復(fù)制存儲在圖形硬件中的一個緩沖區(qū)上。這些屬性只供頂點(diǎn)著色器使用色罚,對于片元著色器來說沒有意義碰缔。
- 這些屬性對每個頂點(diǎn)都要做改變,并不意味著他們的值不能重復(fù)保屯,而只是說明每個頂點(diǎn)都有一個實(shí)際存儲值手负。當(dāng)然,通常情況下他們都是不同的姑尺,但是也有可能會與整個數(shù)組都是同一個值得情況竟终。但是這種情況很浪費(fèi)。
2切蟋、Uniform值
- Uniforms值本質(zhì)上跟屬性一樣统捶,但是跟屬性值不同的是,頂點(diǎn)著色器和片元著色器中都可以有Uniform變量柄粹。
- 所謂屬性就是一個對每個頂點(diǎn)都要做改變的數(shù)據(jù)元素喘鸟。實(shí)際上,頂點(diǎn)位置本身就是一個屬性驻右。屬性是不變的什黑。
- 我們通常設(shè)置完Uniform變量就緊接著發(fā)出渲染一個圖元批次的命令。Uniform實(shí)際上可以無次數(shù)限制的使用堪夭,我們可以設(shè)置一個應(yīng)用于整個表面的單個顏色值愕把,還可以設(shè)置一個時間值,在每次渲染某種類型的頂點(diǎn)動畫時修改它森爽。
- Uniform變量一個常見的應(yīng)用是在頂點(diǎn)渲染中設(shè)置變換矩陣恨豁。
3、紋理數(shù)據(jù)(Texture Data)
- 從頂點(diǎn)著色器和片元著色器中都可以對紋理值進(jìn)行采樣和篩選爬迟。典型情況下橘蜜,片元著色器對一個紋理進(jìn)行采樣,并在一個三角形的表面上應(yīng)用圖形數(shù)據(jù)付呕,但是计福,紋理數(shù)據(jù)的作用并不僅僅是表現(xiàn)圖形。很多圖形文件格式都是以無符號字節(jié)形式對顏色分量進(jìn)行存儲的徽职,但是我們?nèi)匀豢梢栽O(shè)置浮點(diǎn)紋理棒搜。
- 任何大型浮點(diǎn)數(shù)據(jù)塊(例如消耗資源很大的函數(shù)的大型查詢表)都可以通過這種方式傳遞給著色器。
步驟:
1活箕、三個值都可以通過三個通道分別傳到頂點(diǎn)著色器中力麸,頂點(diǎn)著色器處理從客戶機(jī)輸入的數(shù)據(jù)、應(yīng)用變換育韩、進(jìn)行其他的類型的數(shù)學(xué)運(yùn)算來計(jì)算關(guān)照效果克蚂、位移、顏色值等等筋讨。(為了渲染共有3個頂點(diǎn)的三角形埃叭,頂點(diǎn)著色器將執(zhí)行3次,也就是為了每個頂點(diǎn)執(zhí)行一次)在目前的硬件上有多個執(zhí)行單元同時運(yùn)行悉罕,就意味著所有的3個頂點(diǎn)可以同時進(jìn)行處理赤屋;
2立镶、頂點(diǎn)著色器處理完成之后,就會經(jīng)過圖元合成类早,將頂點(diǎn)組合在一起變成圖元媚媒,然后裁剪、轉(zhuǎn)換窗口坐標(biāo)涩僻、進(jìn)行光柵化缭召;
3、接著將數(shù)據(jù)輸入到片元著色器逆日,計(jì)算片元最終顏色以及深度嵌巷,然后傳遞到片元測試模塊以及混合模塊,由片元著色器輸出我們將屏幕上看到的最終顏色值室抽。
注意:
- Attributes屬性值是不能直接傳遞給片元著色器的搪哪,只能通過頂點(diǎn)著色器去傳遞。但是Uniforms和紋理數(shù)據(jù)是可以的坪圾。