前言
前兩篇文章中給你們解析過了什麼是OpenGL的一些經常使用名詞,掌握一些經常使用的名詞,能夠更加方便咱們後面的學習和理解,也方便咱們後面在遇到以後更加容易去查找。而後講了着色器的渲染流程,咱們基本上把大體是怎麼玩兒的也弄清楚了。那麼這一片文章就從OpenGL的渲染架構開始,帶你們聊瞭解一下OpenGL的渲染架構究竟是怎麼組成的。數組
OpenGL渲染架構
首先咱們來看一張架構圖: 架構
解釋一下什麼叫作
客戶端,什麼叫作
服務端:
- 客戶端:咱們編寫的代碼,或者是說調用的OpenGL的API,客戶端是存儲在CPU存儲器中的,而且在應用程序中執行,或者再主系統內存的驅動程序中執行。
- 服務端:就是計算機圖形硬件廠商所提供的OpenGL的實現。咱們編寫的GLSL代碼也是在服務端去運行的,簡單來講就是操做的GPU。
服務端和客戶端在功能上是異步的,也就是說他們是各自獨立的軟件塊或者硬件塊,或者軟硬件都有,爲了得到最佳的性能,咱們但願兩方面都儘量不停地工做。客戶端不斷地將數據塊和命令塊組合到一塊兒送到緩衝區,而後這些緩衝區會發送到服務端執行。服務端將執行這些緩衝區的內容,與此同時客戶端又作好了發送下一個用於渲染的數據或者信息的準備,若是服務端中止工做等待客戶端,或者客戶端中止了工做來等待服務端作好接受更多命令和數據的準備,咱們就把這狀況稱爲管線停滯。異步
從上面的圖,咱們也能看出。客戶端只會向服務端傳遞三種數據,分別是:函數
一、屬性值(Attributes)
- 就是一個對每一個頂點都要作改變的數據元素。實際上,頂點位置自己就是一個屬性。屬性值可使浮點數、整數或布爾數據。
- 屬性老是以四維向量的形式進行內部存儲的,即便咱們不會使用到全部4個份量。例如,一個頂點位置可能存儲爲一個x值,一個y值和一個z值,將佔用4個份量中的3個。OpenGL會將第4個(w份量)設爲1。實際上,若是咱們在二維平面上面繪圖的話,那麼第3個份量就會自動設爲0,第4個份量依舊設爲1。
- 屬性會從本地客戶端內存中複製存儲在圖形硬件中的一個緩衝區上。這些屬性只供頂點着色器使用,對於片元着色器來講沒有意義。
- 這些屬性對每一個頂點都要作改變,並不意味着他們的值不能重複,而只是說明每一個頂點都有一個實際存儲值。固然,一般狀況下他們都是不一樣的,可是也有可能會與整個數組都是同一個值得狀況。可是這種狀況很浪費。
二、Uniform值
- Uniforms值本質上跟屬性同樣,可是跟屬性值不一樣的是,頂點着色器和片元着色器中均可以有Uniform變量。
- 所謂屬性就是一個對每一個頂點都要作改變的數據元素。實際上,頂點位置自己就是一個屬性。屬性是不變的。
- 咱們一般設置完Uniform變量就緊接着發出渲染一個圖元批次的命令。Uniform實際上能夠無次數限制的使用,咱們能夠設置一個應用於整個表面的單個顏色值,還能夠設置一個時間值,在每次渲染某種類型的頂點動畫時修改它。
- Uniform變量一個常見的應用是在頂點渲染中設置變換矩陣。
三、紋理數據(Texture Data)
- 從頂點着色器和片元着色器中均可以對紋理值進行採樣和篩選。典型狀況下,片元着色器對一個紋理進行採樣,並在一個三角形的表面上應用圖形數據,可是,紋理數據的做用並不只僅是表現圖形。不少圖形文件格式都是以無符號字節形式對顏色份量進行存儲的,可是咱們仍然能夠設置浮點紋理。
- 任何大型浮點數據塊(例如消耗資源很大的函數的大型查詢表)均可以經過這種方式傳遞給着色器。
步驟: 一、三個值均可以經過三個通道分別傳到頂點着色器中,頂點着色器處理從客戶機輸入的數據、應用變換、進行其餘的類型的數學運算來計算關照效果、位移、顏色值等等。(爲了渲染共有3個頂點的三角形,頂點着色器將執行3次,也就是爲了每一個頂點執行一次)在目前的硬件上有多個執行單元同時運行,就意味着全部的3個頂點能夠同時進行處理; 二、頂點着色器處理完成以後,就會通過圖元合成,將頂點組合在一塊兒變成圖元,而後裁剪、轉換窗口座標、進行光柵化; 三、接着將數據輸入到片元着色器,計算片元最終顏色以及深度,而後傳遞到片元測試模塊以及混合模塊,由片元着色器輸出咱們將屏幕上看到的最終顏色值。性能
注意:學習
- Attributes屬性值是不能直接傳遞給片元着色器的,只能經過頂點着色器去傳遞。可是Uniforms和紋理數據是能夠的。