OpenGL 渲染管線流程解析

OpenGL 渲染管線流程圖.jpg

這張圖是OpenGL開發(fā)者需要理解的,在以后處理任何圖形渲染,都是依據(jù)它,基于OpenGL封裝的框架也遵循這個圖的規(guī)則。

渲染管線

在OpenGL中,任何事物都在3D空間中,而屏幕和窗口卻是2D像素數(shù)組,這導致OpenGL的大部分工作都是關(guān)于把3D坐標轉(zhuǎn)變?yōu)檫m應(yīng)你屏幕的2D像素。3D坐標轉(zhuǎn)為2D坐標的處理過程是由OpenGL的圖形渲染管線(Graphics Pipeline,大多譯為管線,實際上指的是一堆原始圖形數(shù)據(jù)途經(jīng)一個輸送管道,期間經(jīng)過各種變化處理最終出現(xiàn)在屏幕的過程)管理的。

圖形渲染管線可以被劃分為兩個主要部分:第一部分把你的3D坐標轉(zhuǎn)換為2D坐標,第二部分是把2D坐標轉(zhuǎn)變?yōu)閷嶋H的有顏色的像素。

下圖,是一個圖形渲染管線的每個階段的抽象展示,藍色的是表示可編程的著色器,不過我們常用的一般只有頂點著色器和片元著色器:

OpengGL渲染管線抽象圖

光柵化

光柵化就是把矢量圖形轉(zhuǎn)化成像素點的操作。我們屏幕上顯示的畫面都是由像素組成,而三維物體都是點線面構(gòu)成的。要讓點線面,變成能在屏幕上顯示的像素,就需要Rasterize(光柵化)這個過程。就是從矢量的點線面的描述,變成像素的描述。

如下圖,這樣可能比較好理解: 前面是告訴計算機我有一個圓形,后面是計算機把這個圓形轉(zhuǎn)換成可以顯示的像素點。

光柵化示例圖

著色器

  • 著色器是使用一種叫GLSL的類C語言寫成的。GLSL是為圖形計算量身定制的,它包含一些針對向量和矩陣操作的有用特性。

  • 著色器的開頭總是要聲明版本,接著是輸入和輸出變量、uniform和main函數(shù)。每個著色器的入口點都是main函數(shù),在這個函數(shù)中我們處理所有的輸入變量,并將結(jié)果輸出到輸出變量中。

  • 在OpenGL中,我們必須定義至少一個頂點著色器和一個片段著色器(因為GPU中沒有默認的頂點/片段著色器。采用了這兩種著色器小程序 的數(shù)據(jù)傳輸處理計算的渲染過程,一般稱之為可編程管線。

輸入與輸出

  • 雖然著色器是各自獨立的小程序,但是它們都是一個整體的一部分,出于這樣的原因,我們希望每個著色器都有輸入和輸出,這樣才能進行數(shù)據(jù)交流和傳遞。

  • GLSL定義了in和out關(guān)鍵字專門來實現(xiàn)這個目的。每個著色器使用這兩個關(guān)鍵字設(shè)定輸入和輸出,只要一個輸出變量與下一個著色器階段的輸入匹配,它就會傳遞下去。但在頂點和片段著色器中會有點不同。

Attributs(屬性)

屬性就是對每一個頂點都要作改變的數(shù)據(jù)元素。實際上,頂點位置本身就是一個屬性。屬性值可以是浮點數(shù)、整數(shù)、布爾數(shù)據(jù)。

  • 屬性總是以四維向量的形式進行內(nèi)部存儲的,即使我們不會使用所有的4個分量。一個頂點位置可能存儲(x,y,z),將占有4個分量中的3個。

  • 實際上如果是在平面情況下:只要在xy平面上就能繪制,那么Z分量就會自動設(shè)置為0。

  • 屬性還可以是:紋理坐標、顏色值、關(guān)照計算表面法線。

  • 在頂點程序(shader渲染)可以代表你想要的任何意義。

  • 屬性會從本地客戶機內(nèi)存中復(fù)制存儲在圖形硬件中的一個緩沖區(qū)上。這些屬性只提供給頂點著色器使用,對于片元著色器木有太大意義。

  • 聲明:這些屬性對每個頂點都要做改變,但并不意味著它們的值不能重復(fù)。通常情況下,它們都是不一樣的,但有可能整個數(shù)組都是同一值的情況。

Uniform

Uniform是一種從CPU中的應(yīng)用向GPU中的著色器發(fā)送數(shù)據(jù)的方式,但uniform和頂點屬性有些不同。

  • uniform是全局的(Global)。全局意味著uniform變量必須在每個著色器程序?qū)ο笾卸际仟氁粺o二的,而且它可以被著色器程序的任意著色器在任意階段訪問。
  • 無論你把uniform值設(shè)置成什么,uniform會一直保存它們的數(shù)據(jù),直到它們被重置或更新。

Textures(紋理)

紋理是一個2D圖片(甚至也有1D和3D的紋理),它可以用來添加物體的細節(jié)

  • 在頂點著色器、片段著色器中都可以對紋理數(shù)據(jù)進行采樣和篩選。
  • 典型的應(yīng)用場景:片段著色器對一個紋理值進行采樣,然后在一個三角形表面應(yīng)用渲染紋理數(shù)據(jù)。
  • 可以想象紋理是一張繪有磚塊的紙,無縫折疊貼合到你的房子上,這樣你的房子看起來就像有磚墻外表了。
  • 紋理數(shù)據(jù),不僅僅表現(xiàn)在圖形,很多圖形文件格式都是以無符號字節(jié)(每個顏色通道8位)形式對顏色分量進行存儲的。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容