OPENGL學習筆記之八

2021-08-10 19:44:53 字數 3140 閱讀 5157

2017/11/15

閱讀材料來自learnopengl.com以及learnopengl-cn.github.io

我們通常會自己設定乙個座標的範圍,之後再在頂點著色器中將這些座標變換為標準化裝置座標(normalized device coordinate, ndc)。然後將這些標準化裝置座標傳入光柵器(rasterizer),將它們變換為螢幕上的二維座標或畫素。

將座標變換為標準化裝置座標,接著再轉化為螢幕座標的過程通常是分步(類似於流水線)進行的。在流水線中,物體的頂點在最終轉化為螢幕座標之前還會被變換到多個座標系統(coordinate system)。將物體的座標變換到幾個過渡座標系(intermediate coordinate system)的優點在於,在這些特定的座標系統中,一些操作或運算更加方便和容易。對我們來說比較重要的總共有5個不同的座標系統:

這就是乙個頂點在最終被轉化為片段之前需要經歷的所有不同狀態。

1.概述

為了將座標從乙個座標系變換到另乙個座標系,我們需要用到幾個變換矩陣,最重要的幾個分別是模型(model)觀察(view)投影(projection)三個矩陣。

我們的頂點座標起始於區域性空間(local space),在這裡它稱為區域性座標(local coordinate),它在之後會變為世界座標(world coordinate)觀察座標(view coordinate)裁剪座標(clip coordinate),並最後以螢幕座標(screen coordinate)的形式結束。

如下圖所示:

1. 區域性座標是物件相對於區域性原點的座標,也是物體起始的座標。

2. 下一步是將區域性座標變換為世界空間座標,世界空間座標是處於乙個更大的空間範圍的。這些座標相對於世界的全域性原點,它們會和其它物體一起相對於世界的原點進行擺放。

3. 接下來我們將世界座標變換為觀察空間座標,使得每個座標都是從攝像機或者說觀察者的角度進行觀察的。

4. 座標到達觀察空間之後,我們需要將其投影到裁剪座標。裁剪座標會被處理至-1.0到1.0的範圍內,並判斷哪些頂點將會出現在螢幕上。

5. 最後,我們將裁剪座標變換為螢幕座標,我們將使用乙個叫做視口變換(viewport transform)的過程。視口變換將位於-1.0到1.0範圍的座標變換到由glviewport函式所定義的座標範圍內。最後變換出來的座標將會送到光柵器,將其轉化為片段。

2.區域性空間

區域性空間是指物體所在的座標空間,即物件最開始所在的地方。

我們之前實驗使用的那個箱子的頂點是被設定在-0.5到0.5的座標範圍中,(0, 0)是它的原點。這些都是區域性座標。

3.世界空間

將我們所有的物體匯入到程式當中時,它們有可能會全擠在世界的原點(0, 0, 0)上(寫**的時候出現過這樣的畫面)。

我們想為每乙個物體定義乙個位置,從而能在更大的世界當中放置它們,就要用到世界空間,變換是由模型矩陣(model matrix)實現。

4.觀察空間

觀察空間經常被人們稱之opengl的攝像機(camera)(所以有時也稱為攝像機空間(camera space)視覺空間(eye space))。

觀察空間是將世界空間座標轉化為使用者視野前方的座標而產生的結果。因此觀察空間就是從攝像機的視角所觀察到的空間。而這通常是由一系列的位移和旋轉的組合來完成,平移/旋轉場景從而使得特定的物件被變換到攝像機的前方。這些組合在一起的變換通常儲存在乙個觀察矩陣(view matrix)裡,它被用來將世界座標變換到觀察空間。

5.裁剪空間

在乙個頂點著色器執行的最後,opengl期望所有的座標都能落在乙個特定的範圍內,且任何在這個範圍之外的點都應該被裁剪掉(clipped)。被裁剪掉的座標就會被忽略,所以剩下的座標就將變為螢幕上可見的片段。

因為將所有可見的座標都指定在-1.0到1.0的範圍內不是很直觀,所以我們會指定自己的座標集(coordinate set)並將它變換回標準化裝置座標系,就像opengl期望的那樣。

為了將頂點座標從觀察空間變換到裁剪空間,我們需要定義乙個投影矩陣(projection matrix),它指定了乙個範圍的座標,比如在每個維度上的-1000到1000。投影矩陣接著會將在這個指定的範圍內的座標變換為標準化裝置座標的範圍(-1.0, 1.0)。所有在範圍外的座標不會被對映到在-1.0到1.0的範圍之間,所以會被裁剪掉。

由投影矩陣建立的觀察箱(viewing box)被稱為平截頭體(frustum),每個出現在平截頭體範圍內的座標都會最終出現在使用者的螢幕上。將特定範圍內的座標轉化到標準化裝置座標系的過程(而且它很容易被對映到2d觀察空間座標)被稱之為投影(projection),因為使用投影矩陣能將3d座標投影(project)到很容易對映到2d的標準化裝置座標系中。

一旦所有頂點被變換到裁剪空間,最終的操作——透視除法(perspective division)將會執行,在這個過程中我們將位置向量的x,y,z分量分別除以向量的齊次w分量;透視除法是將4d裁剪空間座標變換為3d標準化裝置座標的過程。這一步會在每乙個頂點著色器執行的最後被自動執行。

在這一階段之後,最終的座標將會被對映到螢幕空間中(使用glviewport中的設定),並被變換成片段。

將觀察座標變換為裁剪座標的投影矩陣可以為兩種不同的形式,每種形式都定義了不同的平截頭體。我們可以選擇建立乙個正射投影矩陣(orthographic projection matrix)或乙個透視投影矩陣(perspective projection matrix)

OpenGL學習筆記(八)

在opengl中繪製乙個物體,會像是這樣 0.複製頂點陣列到緩衝中供opengl使用 glbindbuffer gl array buffer,vbo glbufferdata gl array buffer,sizeof vertices vertices,gl static draw 1.設定頂...

OpenGL學習筆記《八》光照

在理解opengl中的光照之前,先理解一下顏色。在我們現實生活中,我們看到的物體顏色,是物體反射的顏色,即沒有被物體吸收掉的部分。opengl利用這個,在系統中模擬的顏色,就是定義乙個表示物件的顏色向量a,再頂乙個乙個表示光源的顏色向量b,然後在片段著色器中將兩個向量相乘得到表示物體的顏色。因此大致...

OpenGL學習筆記之了解OpenGL

opengl 全寫open graphicslibrary 是個定義了乙個跨程式語言 跨平台的程式設計介面規格的專業的圖形程式介面。它用於三維影象 二維的亦可 是乙個功能強大,呼叫方便的底層圖形庫。說白了,就是opengl是乙個開放的三維圖形軟體包,它獨立於視窗系統和作業系統,以它為基礎開發的應用程...