OpenGL 基礎知識(1)

2021-09-22 21:12:44 字數 2551 閱讀 2510

在opengl中,最基礎的元素就是點,一些點組合在一起,按照預定的方式連線,另外加上光照、貼圖、顏色等就組成了我們在螢幕上所看到的圖形影象。例如,乙個頂點的基礎就是乙個點,只是這個頂點包含位置、顏色等屬性;乙個三角形的基礎就是三個點,按照預定的方式進行連線。我們來看乙個大致的渲染流程圖(摘自opengl superbible):

這是乙個簡化版本,我們可以看到,渲染管線把三個頂點輸入頂點著色器中,新手暫時不用管頂點著色器是什麼,只需要知道這是乙個類似方法(函式)的東西,輸入3個頂點及其附帶的屬性,輸出乙個連線的三角形。它也可以應用顏色,乙個或多個紋理,並移動它們,這條管道也是可程式設計的,可以編寫兩個由圖形硬體執行的程式來處理頂點資料並填充螢幕上的畫素(稱為片段著色器,實際上每個畫素可以有多個片段)

上圖中最大的兩個框框中的處理,vertexshader(頂點著色器) fragmentshader(片元著色器)

頂點著色器處理來自client(客戶端)的傳入資料,頂點著色器將位置資訊進行轉換,如應用數**算來計算光照效果、位移、顏色值等等。要呈現乙個有三個頂點的三角形,頂點著色器要執行三次,每個頂點執行一次,不過現在的硬體,有多個單元可以同時計算,三個頂點可以同時被處理

經過頂點著色器以後,現在可以對三個頂點進行光柵化。將這三個頂點放在一起,然後將三角形逐段柵格化。通過執行片段著色器填充每個片段,它輸出我們將在螢幕上看到的最終顏色值。今天的硬體是大規模並行的,很有可能有多個這樣的片段程式可以同時執行。

當然,想要見證奇蹟發生,我們必須向這些著色器提供一些資料。我們有三種方式將資料傳遞給opengl著色器進行呈現:attributes、uniforms、texture

attributes用於經常改變的資料,只可用於頂點著色器,例如,頂點位置本質上是頂點的乙個位置屬性。屬性變數可以是float int boolean資料,經常儲存為乙個4維向量。但是我們也能用3維甚至是2維。例如,乙個頂點位置大部分都是3維向量,即x,y,z,opengl設定乙個第四維w,為1。例如,當我們在乙個2d平面上顯示位置時,活忽略z軸,或者設定為0,第四維變數會設定成1。當我們只傳送乙個資料時,y,z都會設定為0,w設定為1。除了空間中的位置外,每個頂點還可能發生的其他變化包括紋理座標、顏色值和用於照明計算的表面法線等等

uniforms用於不經常更改的資訊,用於頂點著色器和片元著色器。通常在傳送渲染指令之前傳送uniform變數。我們可以設定應用於整個表面的單個顏色值,也可以設定乙個時間值,以執行某種型別的頂點動畫(請注意,均勻的更改是每批一次,而不是這裡的每乙個頂點一次),最常見的用途就是設定轉換矩陣。

紋理值可以從頂點和片段著色器中取樣和過濾。片段著色器通常對紋理進行取樣,以便在三角形的表面應用影象資料。大多數影象檔案格式以無符號位元組值(每個顏色通道8個位元組)儲存顏色。

out變數宣告為乙個著色器階段的輸出,並在隨後的著色器階段宣告為in即作為隨後著色器的輸入。client不能訪問這些內部變數,而是在頂點和片段著色器(可能還有可選的幾何著色器)中宣告它們。頂點著色器為out變數分配乙個值,該值是常量,或者可以在光柵化時在頂點之間插入。在同名變數中對應的fragment著色器接收此常量。

在3d圖形中,我們經常用的兩種投影方式就是正交投影和透視投影。這些投影方式,或者說座標系的型別,實際上只是乙個特殊形成的4x4變換矩陣。在計算機三維影象中,投影可以看作是一種將三維座標變換為二維座標的方法

。簡單地說,我們需要這些型別之一的投影矩陣在適當的座標系中呈現幾何圖形。如果不使用這些矩陣中的任何乙個,將得到乙個預設的正交投影,其中軸的範圍僅為-1.0到1.0。

通常,我們經常在2d中用正交投影,保持z軸為0。當然,z軸可以擴充套件到我們想要的任何長度。下圖顯示了乙個在所有三個方向上從-100延伸到+100的正投影示例。這個投影包含所有的幾何圖形,如果我們在視野外檢視指定幾何形狀,則會對其進行剪下,這意味著它實際上是沿著視野的邊界進行剪下的。在正交投影中,落在這個空間內的所有東西都顯示在螢幕上,沒有相機或眼睛座標系的概念。正交投影多用於建模等,投影不會改變其模型大小。

透視投影是為了獲得接近真實三維物體的視覺效果而在二維的紙或者畫布平面上繪圖或者渲染的一種方法。它具有消失感、距離感、相同大小的形體呈現出有規律的變化等一系列的透視特性,能逼真地反映形體的空間形象。透視投影通常用於動畫、視覺**以及其它許多具有真實性反映的方面。

基本的透視投影模型由視點observer、near近平面和far遠平面(遠平面可以是無限遠,在這裡我們設定乙個值便於理解),三部分構成(要求observer不在near上),稱為視椎體。observer可以認為是觀察者的位置,也是觀察三維世界的角度。near近平面一般被認為渲染三維物件透檢視的二維平面。對於世界即near和far之間中的任一點x,構造一條起點為observer並經過x點的射線r,r與平面near的交點xp即是x點的透視投影結果。三維世界的物體可以看作是由點集合 構成的,這樣依次構造起點為observer,並經過點xi的射線ri,這些射線與視平面fnear的交點集合便是三維世界在當前視點的透檢視。

OpenGL基礎知識 三

今天講一下如何在opengl中繪製一些簡單的圖形。現在把opengl基礎知識 二 中編寫的程式做一下簡單的修改,源 如下 include void renderscene void 當視窗大小變化時呼叫 void changesize glsizei w,glsizei h int main int...

OpenGL基礎知識 五

opengl狀態機 在opengl中使用狀態機的機制去儲存opengl當前的狀態。所謂的opengl狀態機也就是一組opengl的狀態集合。有一些狀態可以開啟或關閉,可以通過glenable glenum capability 函式進行開啟,gldisable glenum capability 對...

OpenGL基礎知識(一)

一 opengl是什麼?1 opengl是一種應用程式程式設計介面,它是一種可以對圖形硬體裝置特性進行訪問的軟體庫。2 opengl被設計為乙個現代化的 硬體無關的介面,因此我們可以在不考慮計算機作業系統或視窗系統的前提下,在多種不同的圖形硬體系統上,或者完全通過軟體的方式實現opengl介面。3 ...