1. 程式人生 > >「音視訊直播技術」OpenGL渲染之距陣變換

「音視訊直播技術」OpenGL渲染之距陣變換

model座標

前言

在前面的幾篇文章中我介紹了以下幾種音視訊直播技術:

接下來幾篇文章為大家介紹一下Android下如何使用OpenGL進行渲染。

OpenGLES

在Android下進行視訊渲染使用的是 OpenGLES。OpenGLES(OpenGL for Embedded Systems)就是用在嵌入式系統中的 OpenGL。

OpenGL是一個非常龐大而又專業的知識,如果想完全撐握它需要花不少時間。而視訊渲染只用到了OpenGL的一小部分知識,所以我們就採取用多少學多少的辦法,這樣可以讓我們更專注於音視訊直播技術。

但即使這樣,我們還是要先補習一些資料的基本知識。如果沒有這些基礎,我們是無法理解視訊渲染過程的。

影象渲染過程

一般將一個3D影象顯示在2D的平面上需要三個步驟的距陣變換,我們稱之為MVP,即模型(Model), 觀察(View)以及投影(Projection)。
- 模型:將要顯示的3D物體從模型座標系變成世界座標系。
- 觀察:將3D物體從世界座標系變換成從人眼角度看到物體的座標系。
- 投影:就是將3D座標系換成2D座標系。也就是3D物理如何在2D平面上展示。即我們通常說的降維。

下面我們介紹下實現 MVP 轉換需要的數學知識。

距陣

在三維圖形學用(x,y,z,w)代表一個頂點,它是一個齊次座標

  • 其中的 x,y 我們都知道是橫軸和縱軸。
  • z 代表深度,比如按右手座標來說,離我們眼睛越遠的深度越深,z值也就越小。
  • w 是為了距陣做乘法運算而增加的。

因此,我們在三維圖形學中只用到4x4矩陣,它能對頂點(x,y,z,w)作變換。頂點變換使用距陣左乘的方法,其公式如下:

矩陣 x 頂點 = 變換後的頂點。

距陣左乘

左手指著a,右手指著x,得到ax。 左手移向右邊一個數b,右手移向下一個數y,得到by。依次類推,就得到了右邊的結果。

距陣的平移

有個 4x4 的距陣,如下:

平移距陣

其中,X、Y、Z是點的位移增量。例如,若想把向量(10, 10, 10, 1)沿X軸方向平移10個單位,可得:

平移運算

距陣的縮放

有個 4x4 的距陣,如下:

縮放距陣

如果想把一個向量沿各方向放大2倍,可得:

縮放運算

是不是很神奇?

距陣的旋轉

旋轉矩陣比較複雜,繞 X 軸旋轉使用的距陣:

繞X軸旋轉

繞 Y 軸旋轉使用的距陣:

繞Y軸旋轉

繞 Z 軸旋轉使用的距陣:

繞Y軸旋轉

累積距陣變換

前面已經學習瞭如何旋轉、平移和縮放向量。把這些矩陣相乘就能將它們組合起來,例如:

TransformedVector = TranslationMatrix * RotationMatrix * ScaleMatrix * OriginalVector;

這行程式碼首先執行縮放,接著旋轉,最後才是平移。這就是矩陣乘法的工作方式。

另外,變換的順序不同,得出的結果也不同。所以,順序不能亂。

距陣的正投影

正投影矩陣也比較複雜,我們這裡直接給出,大家可以在網上查詢相關資料,自己推匯出這個距陣:

正投影距陣

小結

上面介紹了三維圖型學中需要的一些數學基礎知識。OpenGL也是按照上面的數學知識進行繪圖的。當然,在編寫OpenGL程式時,不需要直接寫這些數學公式,OpenGL已經為我們提供了非常方便的函式,我們只需要呼叫就行了。但為了便於我們對圖型的理解,這些基礎知識還是非常必要的。

參考

希望大家觀注我,謝謝!