OpenGL初識

OpenGL初識

圖形API簡介

  • OpenGL(Open Graphics Library):一個跨編程語言、跨平臺的圖形程序接口,它將計算機的資源抽象稱爲一個個OpenGL的對象,對這些資源的操做抽象爲⼀個個的OpenGL指令。
  • OpenGL ES (OpenGL for Embedded Systems):是OpenGL 三維圖形API的子集,針對⼿手機、PDA和遊戲主機等嵌⼊式設備而設計,OpenGL ES爲了支持新改進的方法拋棄了對於舊式的低效的內存複製操做的支持。
  • DirectX:是由不少API組成的,DirectX並非一個單純的圖形API。最重要的是DirectX是屬於Windows上⼀個多媒體處理API。並不支持Windows之外的平臺,因此不是跨平臺框架。按照性質分類,能夠分爲四⼤大部分,顯示部分、聲⾳部分、輸入部分和網絡部分。
  • Metal:Apple爲遊戲開發者推出了了新的平臺技術Metal,該技術可以爲3D圖像提升10倍的渲染性能。Metal是Apple爲了解決3D渲染⽽而推出的框架。

圖形API的功能:實現圖形的底層渲染

  • 在遊戲開發中,對於遊戲場景/遊戲⼈物的渲染
  • 在⾳音視頻開發中,對於視頻解碼後的數據渲染
  • 在地圖引擎,對於地圖上的數據渲染
  • 在動畫中,實現動畫的繪製
  • 在視頻處理理中,對於視頻加上濾鏡效果

OpenGL名詞註解

  • GPU:圖形處理單元,圖形卡上的可編程芯片,它是高度並行的,而且具備很是快的速度。可以結合幾何、顏色、燈光和其餘數據而產生一個屏幕圖像的硬件組件。算法

  • 渲染:屏幕只有2維,所以顯示3D數據的技巧就在於產生可以迷惑眼睛使其看到丟失的第3維的一個圖像。將數學和圖形數據轉換成3D空間圖像的操做叫作渲染編程

  • 像素:在計算機上顯示的圖片是由矩形的顏色點組成的,這些矩形的顏色點叫作像素。單獨的像素,若是經過放大鏡仔細觀察顯示器,你會看到每一個像素都是由3個顏色元素組成的,即一個紅點、一個綠點和一個藍點。小程序

  • 緩存OpenGL ES爲兩個內存區域間的數據交換定義了緩存(buffers)的概念。緩存是指 圖形處理器可以控制和管理的連續RAM。數組

程序從 CPU 的內存複製數據到 OpenGL ES 的緩存。在 GPU 取得一個緩存的全部權之後,運行在 CPU 中的程序理想狀況下將不 再接觸這個緩存。經過控制獨佔的緩存,GPU 就可以儘量以最有效的方式讀寫內存。 圖形處理器把它處理大量數據的能力異步同時地應用到緩存上,這意味着在 GPU 使用 緩存中的數據工做的同時,運行在 CPU 中的程序能夠繼續執行。緩存

  • OpenGL上下文(context):用於配置OpenGL的保存在特定平臺的軟件數據結構中的信息會被封裝到一個OpenGL上下文(context)中。OpenGL是一個狀態機器,這意味着在一個程序中設置了一個配置值後,這個值會一直保持,直到程序修改了這個值。切換上下文每每會產生較大的開銷,可是不一樣的繪製模塊,可能須要使用徹底獨立的狀態管理。所以,能夠在應用程序中分別建立多個不一樣的上下⽂,在不一樣線程中使用不一樣的上下文,上下文之間共享紋理、緩衝區等資源。這樣的方案,會⽐反覆切換上下文,或者大量修改渲染狀態,更加合理高效的。網絡

  • OpenGL狀態機數據結構

    1. 狀態機是一個抽象的模型,表示一組狀態變量的集合。每一個狀態變量能夠有各類不一樣的值,或者只能能夠打開或關閉等。當咱們在OpenGL中進行繪圖時,若是每次都要指定全部這些變量顯然有點不切實際。反之,OpenGL使用了一種狀態模型(或稱狀態機)來追蹤全部的OpenGL狀態變量。當一個狀態值被設置以後,它就一直保持這個狀態,直到其餘函數對它進行修改成止。許多狀態只能簡單地打開或關閉。例如,深度測試就是要麼打開、要麼關閉。
    2. OpenGL能夠記錄本身的狀態(好比:當前所使用的顏色、是否開啓了混合功能,等等,這些都是要記錄的)
    3. OpenGL能夠接收輸入(當咱們調用OpenGL函數的時候,實際上能夠當作OpenGL在接收咱們的輸入),根據輸入的內容和本身的狀態,修改本身的狀態,而且能夠獲得輸出(好比咱們調用glColor3f,則OpenGL接收到這個輸入後會修改本身的「當前顏色」這個狀態;咱們調用glRectf,則OpenGL會輸出一個矩形)
    4. OpenGL能夠進入中止狀態,再也不接收輸入。這個可能在咱們的程序中表現得不太明顯,不過在程序退出前,OpenGL總會先中止工做的。
  • 頂點(空間中的一個位置):在2D和3D中,當咱們繪製一個物體時,其實是用一些更小的稱爲圖元(Primitives)的形狀來組成這個物體。圖元是一維或者二維的實體或表面,如點、直線和多邊形(平面多邊的形狀)。在3D空間中,咱們把圖元組合在一塊兒建立3D物體。例如一個三維立方體是由6個正方形組成,每一個正方形表明一個獨立的面。正方形(其餘任何圖元)的每一個角稱爲頂點(Vertex)。這些頂點就在3D空間中指定了一個特定的座標。頂點其實就是2D或3D空間中的一個座標。架構

  • 頂點數組:一個頂點(vertex)就是一個座標空間的點。頂點數組就是存儲這一個圖形的全部頂點數據的一段緩存。框架

  • 管線異步

    • OpenGL的模型就比如一條生產線或者管線。數據流在這個模型中一般是單一路經的,數據經過咱們的程式調用的命令進入管線的開端,而後流過一個一個階段直到管線的末端。
    • OpenGL經過鏈接多個叫作着色器的小程序並佐以固定功能函數做爲"膠水"來工做。當咱們繪圖時,圖形處理器執行咱們的着色器並將它們的輸入輸出在管線中串聯起來,直到像素完成於管線末端。
  • 固定管線/存儲着色器

    • 在早期的OpenGL版本,它封裝了不少種着色器程序塊內置的一段包含了光照、座標變換、裁剪等等諸多功能的固定shader程序來完成,來幫助開發者來完成圖形的渲染而開發者只須要傳入相應的參數,就能快速完成圖形的渲染。
    • 可是因爲OpenGL的使用場景很是豐富,固定管線或存儲着色器沒法完成每個業務。這時將相關部分開放成可編程。
  • 着色器程序shader

    • 就全面的將固定渲染管線架構變爲了可編程渲染管線。所以,OpenGL在實際調用繪製函數以前,還須要指定一個由shader編譯成的着色器程序。常見的着色器主要有頂點着色器(VertexShader),片斷着色器(FragmentShader)/像素着色器(PixelShader) ,幾何着色器(GeometryShader)曲面細分着色器(TessellationShader)。片斷着色器和像素着色器只是在OpenGL和DX中的不一樣叫法而已。惋惜的是,直到OpenGL ES 3.0,依然只支持了頂點着色器和片斷着色器這兩個最基礎的着色器。
    • OpenGl在處理Shader時,和其餘編譯器同樣。經過編譯、連接等步驟,生成了着色器程序(glProgram),着色器程序同時包含了頂點着色器和片斷着色器的運算邏輯。在0penGL進行繪製的時候,首先由頂點着色器對傳入的頂點數據進行運算。再經過圖元裝配,將頂點轉換爲圖元。而後進行光柵化,將圖元這種矢量圖形,轉換爲柵格化數據。最後,將柵格化數據傳入片斷着色器中進行運算。片斷着色器會對柵格化數據中的每個像素進行運算,並決定像素的顏色。
  • 頂點着色器VertexShader

    • 用來處理圖形每一個頂點變換(旋轉/平移/投影等)。
    • 頂點着色器是逐頂點運算的程序,也就是說每一個頂點數據都會執行一次頂點着色器,固然這是並行的,而且頂點着色器運算過程當中沒法訪問其餘頂點的數據。
    • 典型的須要計算的頂點屬性主要包括頂點座標變換、逐頂點光照運算等等。頂點座標由自身座標系轉換到歸一化座標系的運算,就是在這裏發生的。
  • 片元着色器程序FragmentShader

    • 用來處理圖形中每一個像素點顏色的計算和填充的程序。
    • 它是逐像素運算的程序,也就是說每一個像素都會執行一次片斷着色器,固然也是並行的。
  • GLSL(OpenGL Shadding Language):OpenGL着色器使用一種叫作OpenGL着色語言(OpenGL Shading Language)的語言進行編寫,或者叫作GLSL。這個語言的編譯器內置在OpenGl中。

  • 光柵化Rasterization:實際繪製或填充每一個頂點之間的像素造成線段就叫作光柵化。

  • 紋理:一個用來保存圖像的顏色元素值的 OpenGL ES 緩存。

  • 混合Blending:像素的顏色將會和幀緩衝區中顏色附着上的顏色進行混合,混合的算法能夠經過0penGL的函數進 行指定。

  • 變幻矩陣:計算圖形發生變化的矩陣。

  • 投影矩陣:用於將3D座標轉換爲2D座標,並在2D下繪製。

  • 渲染上屏/交換緩衝區

    • 通常窗口上顯示的是某個渲染緩衝區的資源,若是直接在這個緩衝區中進行渲染,在渲染過程當中,窗口會顯示不完整的圖像。
    • 因此OpenGL程序都至少使用兩個緩衝區,在窗口中看到的是屏幕緩衝區,還有一個不顯示的離屏幕緩衝區。在離屏緩衝區渲染完成後,經過離屏緩衝區和屏幕緩衝區進行數據交換實現屏幕顯示。
    • 屏幕的刷新通常是逐行進行的。若是一次刷新未結束時進行了兩個緩衝區交換,圖像就會錯亂,一部分是舊圖的內容,一部分是新圖的內容。所以,交換須要等到屏幕發出刷新完成的信號,這個信號叫垂直同步信號,這個技術就是垂直同步技術。
    • 在使用雙緩衝區和垂直同步技術的狀況下,離屏渲染完成後收到垂直同步信號並交換緩衝區後才能進行下一幀的渲染。這樣沒法達到最高的幀率,硬件性能產生了浪費。所以,引入了三緩衝區技術。等待垂直同步信號時,交替渲染兩個離屏緩衝區,屏幕刷新完成後,屏幕渲染區和最近完成渲染的離屏緩衝區交換。

OpenGL座標系解析

在一個簡單的平面計算機屏幕上繪製點和線時,咱們根據行和列指定位置。

在OpenGL或幾乎全部的3D PAI中建立一個用於繪製的窗口時,必須指定但願使用的座標系統以及指定的座標如何映射到實際的屏幕像素。

2D笛卡爾座標系

在二維繪圖中,最經常使用的是笛卡爾座標系統。笛卡爾座標由一個x座標和y座標構成。x座標測量水平方向的位置,y座標測量垂直方向的位置。x軸和y軸垂直相交定義了一個平面。

2D笛卡爾座標系

3D笛卡爾座標系

2D笛卡爾座標新增一個表示深度份量的z軸就是3D笛卡爾座標。

3D笛卡爾座標系

視口

視口就是窗口內部用於繪製裁剪區域的客戶區域。視口簡單的把裁剪區域映射到窗口中的一個區域。一般,視口被定義爲整個窗口,但這並不是嚴格必須的。

視口被定義爲整個窗口

有時咱們只想在窗口的一部分部分進行繪圖。咱們可使用視口來縮小和放大窗口中的圖像,也能夠經過把視口設置大於窗口的用戶區域,從而只顯示裁剪區域的一部分。

視口被定義爲窗口的一部分

投影方式

首先須要理解投影:把3D幾何圖形的座標數據投影在一個2D的平面。就像用筆在玻璃上描摹出玻璃後面的物體的外形。而平面上的投影就是視景體。經過指定投影,咱們能夠指定在窗口中顯示的視景體。

3D圖像投影到2D平面

正投影

正投影又叫平行投影。使用這種投影時,須要指定一個正方形或長方形的視景體。視景體以外的任何物體都不會被繪製。並且,全部實際大小相同的物體在屏幕上都具備相同的大小,無論它們是遠是近。

正投影

咱們還能夠在正投影中經過指定遠、近、左、右、頂和底裁剪平面來指定視景體。在這個視景體中出現的物體和圖形將被投影( 考慮它們的方向)到一個在屏幕上出現的2D圖像。

透視投影

在透視投影中,遠處的物體看上去比近處的物體更小一些。它的視景體看上去有點像一個頂部被削平的金字塔。剩下來的這個形狀稱爲平截頭體( Frustum)。靠近視景體前面的物體看上去比較接近它們的原始大小。可是,當靠近視景體後部的物體被投影到視景體的前部時,它們看上去就顯得比較小。在模擬和3D動畫中,這 種投影可以得到最大程度的逼真感。

透視投影
相關文章
相關標籤/搜索