OpenGL入門 — 專業(yè)名詞解釋

OpenGL入門 — MAC環(huán)境搭建

上一篇博客介紹了如何在 MAC 上搭建 OpenGL環(huán)境,接下來我們要做的就是理解一些專業(yè)的名詞,以便于我們更好的學(xué)醫(yī)后面的內(nèi)容,可能大多數(shù)人都聽過 OpenGL、OpenGL ES 、Metal、DirectX,那么他們到底是什么呢?之間又有什么關(guān)系呢?又可以用來做什么呢?接下來就為大家一一揭曉答案。

  • 問題一:它們到底是什么呢?

    通俗的講他們都是圖形的API。
    OpenGL(Open Graphics Library)是?個跨編程語?言、跨平臺的編程圖形程序接?口,它將計算機的資源抽象稱為?個OpenGL的對象,對這些資源的操作抽象為?個的OpenGL指令。

    OpenGL ES (OpenGL for Embedded Systems)OpenGL三維圖形API的?子集,針對?手機、 PDA和游戲主機等嵌?入式設(shè)備?而設(shè)計,去除了了許多不不必要和性能較低的API接?口。

    DirectX是由很多API組成的,DirectX并不不是?個單純的圖形API. 最重要的是DirectX是屬于Windows上?個多媒體處理理API。并不支持Windows以外的平臺,所以不是跨平臺框架, 按照性 質(zhì)分類,可以分為四?大部分,顯示部分、聲?音部分、輸?入部分和?網(wǎng)絡(luò)部分。

    Metal : Apple為游戲開發(fā)者推出了了新的平臺技術(shù)Metal,該技術(shù)能夠為3D圖像提?高10倍的渲染性能。MetalApple為了了解決3D渲染?而推出的框架。

  • 問題二:它們之間有什么關(guān)系呢?

    早在 2014 的WWDC上蘋果正式推出Metal,作為一種低層次的渲染應(yīng)用程序編程接口,在iOS 8中,Apple引入了Metal 3D圖形庫,保證軟件可以運行在不同的圖像芯片上,它在移動平臺上擁有較OpenGL高達10倍的繪圖性能。在iOS12.0以后,蘋果便摒棄了OpenGL的相關(guān)API,轉(zhuǎn)而使用Metal作為底層渲染,但是我們依舊可以使用OpenGL的相關(guān)API,因為在這之前蘋果的底層渲染也是基于OpenGL/OpenGL ES的,并且提供了非常豐富的OpenGLAPI

  • 問題三:它們(圖形 API)可以用來解決什么問題呢?

    OpenGL/OpenGL ES/Metal在任何項目中解決問題的本質(zhì)就是利用GPU芯片來高效的渲染圖形圖像。圖形APIiOS開發(fā)者唯一接近GPU的方式。
    直觀的講就是實現(xiàn)圖形的底層渲染。

    • 比如說在游戲開發(fā)中,對于游戲場景/游戲人物的渲染
    • 比如在音頻開發(fā)中,對于視頻解碼后的數(shù)據(jù)渲染
    • 比如在地圖引擎,對于地圖上的數(shù)據(jù)渲染
    • 比如在動畫中,實現(xiàn)動畫的繪制
    • 比如在視頻處理中,對于視頻加入濾鏡效果等

關(guān)于Open GL 的一些專業(yè)名詞:

  1. Open GL狀態(tài)機

    從字面意思我們可以理解為一種保存對象狀態(tài)的機器,并且可以根據(jù)據(jù)輸入修改當(dāng)前狀態(tài)進行響應(yīng)
    狀態(tài)機特點:

  • 記憶功能,保存當(dāng)前狀態(tài)
  • 接收輸入,修改當(dāng)前狀態(tài),或根據(jù)當(dāng)前狀態(tài)進行輸出
  • 當(dāng)進?特殊狀態(tài)(停機狀態(tài))時,不再接收輸?,停?工作
  1. Open GL上下文(context)

    在應(yīng)?程序調(diào)?任何OpenGL的指令之前,首先需要創(chuàng)建?個OpenGL的上下?文。這個上下?是?個?常龐?的狀態(tài)機,保存了了OpenGL中的各種狀態(tài),這也是OpenGL指令執(zhí)?的基礎(chǔ)。
    OpenGL的函數(shù)不管在哪個語?中,都是類似C語?一樣的面向過程的函數(shù)。本質(zhì)上都是對OpenGL上下?這個龐?的狀態(tài)機中的某個狀態(tài)或者對象進行操作。通過對 OpenGL指令的封裝,可以將OpenGL的相關(guān)調(diào)?封裝成為?個?向?qū)ο蟮膱D形API。
    由于OpenGL上下?是?個巨?大的狀態(tài)機,切換上下文往往會產(chǎn)生較?的開銷,但是不同的繪制模塊,可能需要使?完全獨立的狀態(tài)管理。因此,可以在應(yīng)?程序中分別創(chuàng)建多個不同的上下文,在不同線程中使?不同的上下文,上下?之間共享紋理、緩沖區(qū)等資源。這樣的?方案,會?比反復(fù)切換上下?,或者?量修改渲染狀態(tài),更加合理高效。
    要點:

    • 本質(zhì)是一個保存各種狀態(tài)的龐大的狀態(tài)機
    • 是OpenGL指令執(zhí)行的基礎(chǔ),需要在調(diào)用指令之前創(chuàng)建
    • 切換上下文開銷大,多個上下文之間共享紋理、緩沖區(qū)等資源
    • 面向過程、可以將OpenGL的相關(guān)調(diào)?封裝成為?個?向?qū)ο蟮膱D形API
  2. 渲染

    將圖形/圖像數(shù)據(jù)通過解碼,將其顯示繪制到屏幕上的操作

  3. 頂點數(shù)組 VertexArray/頂點緩沖區(qū) VertexBuffer
    頂點是在繪制圖像的時候頂點位置的數(shù)據(jù),頂點數(shù)據(jù)就是圖像的框架,頂點數(shù)據(jù)可以直接存儲在數(shù)組中或者緩存到GPU內(nèi)存中。

    OpenGL中的圖像都是由圖元組成。
    圖元類型:

    • 三角形

    在調(diào)?繪制?法的時候,直接由內(nèi)存?zhèn)魅腠旤c數(shù)據(jù),也就是說這部分?jǐn)?shù)據(jù)之前是存儲在內(nèi)存當(dāng)中的,被稱為頂點數(shù)組(VertexArray)
    ?性能更高的做法是,提前分配?塊顯存,將頂點數(shù)據(jù)預(yù)先傳?到顯存當(dāng)中。這部分的顯存,就被稱為頂點緩沖區(qū)(VertexBuffer)。

  • 要點:
    頂點數(shù)組與頂點緩沖區(qū)的區(qū)別在于頂點數(shù)據(jù)的存儲方式不同,頂點數(shù)組在內(nèi)存中,而頂點緩沖區(qū)在顯存中。
  1. 管線
    可以想象成流?線,每個任務(wù)類似流?線般執(zhí)?,任務(wù)之間有先后順序。管線是?個抽象的概念,之所以稱之為管線是因為顯卡在處理數(shù)據(jù)的時候是按照一個固定的順序來的,而且嚴(yán)格按照這個固定順序執(zhí)行。

  2. 固定管線/存儲著色器
    已經(jīng)封裝好的shader程序,開發(fā)者只需要傳入對應(yīng)的參數(shù),就能快速完成圖形的渲染。
    固定管線、存儲染色器無法完成每個業(yè)務(wù)時,可以把相關(guān)業(yè)務(wù)變成可編程,可以根據(jù)實際情況自定義管線完成任務(wù)。

    什么是著色器程序呢?
    通常我們調(diào)用openGL的繪制函數(shù)的時候,需要指定一個有shader編譯成的著色器。常見的著色器有:

    • 頂點著?器(VertexShader)
    • ?段著?器(FragmentShader)/像素著?器(PixelShader)
    • 幾何著?(GeometryShader)
    • 曲?細分著?器(TessellationShader)

片段著?器像素著?器只是在OpenGLDirectX中的不同叫法而已。目前OpenGL只支持頂點著?器和片段著?器這兩個基本著色器。

在OpenGL進行繪制的時候,?先由頂點著?器對傳?的頂點數(shù)據(jù)進?運算。再通過圖元裝配,將頂點轉(zhuǎn)換為圖元。然后進?光柵化,將圖元這種?量圖形,轉(zhuǎn)換為柵格化數(shù)據(jù)。最后,將柵格化數(shù)據(jù)傳入?段著?器中進?運算。?段著?器會對柵格化數(shù)據(jù)中的每一個像素進行運算,并決定像素的顏?。

  1. 頂點著?器(VertexShader)

    OpenGL用來處理頂點數(shù)據(jù)的程序,典型的需要計算的頂點屬性主要包括頂點坐標(biāo)變換、逐頂點光照運算等等,是將頂點坐標(biāo)由自身坐標(biāo)系轉(zhuǎn)換到歸一坐標(biāo)系。
    重點:

    • ?來處理理圖形每個頂點變換(旋轉(zhuǎn)/平移/投影)
    • 3D圖形數(shù)據(jù) 投影換算 為2D圖形數(shù)據(jù)
    • 并行計算,且運算過程中?法訪問其他頂點的數(shù)據(jù)
  2. 片元(片段)著色器

    片元可以理解為屏幕當(dāng)中的像素點
    ?元著?器是OpenGL中?于計算?段(像素)顏?的程序。一般?來處理圖形中每個像素點顏?計算和填充。

    ?元著?器是逐像素運算的程序,也就是說每個像素都會執(zhí)?一次,當(dāng)然也是并?的。

    重點:

    • 用來處理一個個像素點的顏色計算與填充
    • 逐像素且在GPU并行運行的程序,即每個像素都會執(zhí)行一次
    • 并行計算,且運算過程中?法訪問其他頂點的數(shù)據(jù)
  3. GLSL(OpenGL Shading Language)

    GLSL著色語?是?來在OpenGL中著?編程的語?,是在圖形卡的GPU上執(zhí)?的。代替了固定的渲染管線的?部分,使渲染管線中不同層次具有可編程性。?如:視圖轉(zhuǎn)換、投影轉(zhuǎn)換等。GLSL(GL Shading Language)的著?器代碼分成2個部分: Vertex Shader(頂點著?器)Fragment(?斷著?器)。

    • OpenGL中著色編程的語言
    • 可以通過GLSL自定義著色器
  4. 光柵化(Rasterization)

    光柵化就是把頂點數(shù)據(jù)轉(zhuǎn)換為片元的過程。具有將圖轉(zhuǎn)化為?個個柵格組成的圖象 的作?,特點是每個元素對應(yīng)幀緩沖區(qū)中的?像素。

    光柵化其實是?種將?何圖元變?yōu)槎S圖像的過程。該過程包含了兩部分的?作。第?部分工作:決定窗?坐標(biāo)中的哪些整型柵格區(qū)域被基本圖元占?;第?部分?作:分配一個顏?值和?個深度值到各個區(qū)域。

    把物體的數(shù)學(xué)描述以及與物體相關(guān)的顏色信息轉(zhuǎn)換為屏幕上用于對應(yīng)位置的像素及?于填充像素的顏?,這個過程稱為光柵化。這是?個將模擬信號轉(zhuǎn)化為離散信號的過程。

    重點:

    • 頂點數(shù)據(jù) => 片元
    • 幾何圖元 => 二維圖像
    • 把物體的數(shù)學(xué)描述和相關(guān)的顏色信息轉(zhuǎn)換為屏幕上對應(yīng)位置的像素及填充像素顏色
    • 將模擬信號轉(zhuǎn)換為離散信號
    • 是不可編程的過程
    • 過程:1>決定窗?坐標(biāo)中的哪些整型柵格區(qū)域被基本圖元占?;2>分配一個顏?值和?個深度值到各個區(qū)域。
  5. 紋理(Texture)

    紋理可以理解為圖?。 在渲染圖形時需要在頂點圍成的區(qū)域中填充圖?,使得場景更加逼真。?這?使?的圖?,就是常說的紋理。只是在OpenGL,我們更加習(xí)慣叫紋理,?不是圖?。

  6. 混合(Blending)

    在測試階段之后,如果像素依然沒有被剔除,那么像素的顏?將會和幀緩沖區(qū)中顏?附著上的顏色進?混合,混合的算法可以通過OpenGL的函數(shù)進行指定。但是OpenGL提供的混合算法有限。如果需要更加復(fù)雜的混合算法,一般可以通過片段著?器進?實現(xiàn),當(dāng)然性能會?原?的混合算法差?些。

  7. 矩陣

    1. 變換矩陣(Transformation):圖形想發(fā)?平移,縮放,旋轉(zhuǎn)變換時使用 。
    2. 投影矩陣(Projection):將3D坐標(biāo)轉(zhuǎn)換為2D屏幕坐標(biāo)時使用,實際線條也將在二維坐標(biāo)下進行繪制。
  8. 渲染上屏/交換緩沖區(qū)(SwapBuffer)

    渲染緩沖區(qū)?般映射的是系統(tǒng)的資源?如窗?。如果將圖像直接渲染到窗口對應(yīng)的渲染緩沖區(qū),則可以將圖像顯示到屏幕上。

    值得注意的是,如果每個窗?只有?個緩沖區(qū),那么在繪制過程中屏幕進?了刷新,窗?可能顯示出不完整的圖像。

    為了解決這個問題,常規(guī)的OpenGL程序?少都會有兩個緩沖區(qū)。顯示在屏幕上的稱為屏幕緩沖區(qū),沒有顯示的稱為離屏緩沖區(qū)。在一個緩沖區(qū)渲染完成之后,通過將屏幕緩沖區(qū)和離屏緩沖區(qū)交換,實現(xiàn)圖像在屏幕上顯示。

    由于顯示器的刷新?般是逐?進?的,為了防?交換緩沖區(qū)的時候屏幕上下區(qū)域的圖像分屬于兩個不同的幀,交換一般會等待顯示器刷新完成的信號,在顯示器器兩次刷新的間隔中進?交換,這個信號就被稱為垂直同步信號,這個技術(shù)被稱為垂直同步。

    使用了雙緩沖區(qū)和垂直同步技術(shù)之后,由于總是要等待緩沖區(qū)交換之后再進?下?幀的渲染,使得幀率無法完全達到硬件允許的最??平。為了解決這個問題,引?了三緩沖區(qū)技術(shù)。在等待垂直同步時,來回交替渲染兩個離屏的緩沖區(qū),?垂直同步發(fā)?生時,屏幕緩沖區(qū)和最近渲染完成的離屏緩沖區(qū)交換,實現(xiàn)充分利利?硬件性能的?的。

重點:

  • 渲染緩沖區(qū) => 系統(tǒng)的資源,例如窗口

  • 渲染上屏 => 將圖像直接渲染到窗口對應(yīng)的渲染緩沖區(qū)

  • 如果每個窗口只有一個緩沖區(qū),在繪制過程中刷新了屏幕,窗口可能顯示不出完整的圖像

    • 屏幕緩沖區(qū):用于顯示在屏幕上
    • 離屏緩沖區(qū):沒有顯示的
    • 在一個緩沖區(qū)渲染完成后,將屏幕緩沖區(qū)和離屏緩沖區(qū)進行交換,實現(xiàn)圖像在屏幕上的顯示
  • 為了防?交換緩沖區(qū)的時候屏幕上下區(qū)域的圖像分屬于兩個不同的幀

    • 垂直同步信號->等待顯示器刷新完成的信號,在顯示器器兩次刷新的間隔中進?交換
  • 使用了雙緩沖區(qū)和垂直同步技術(shù)之后,由于總是要等待緩沖區(qū)交換之后再進?下?幀的渲染,使得幀率無法完全達到硬件允許的最??平。

    • 三級緩沖區(qū)技術(shù):
      • 在等待垂直同步時,來回交替渲染兩個離屏的緩沖區(qū)
      • 垂直同步發(fā)生時,屏幕緩沖區(qū)和最近渲染完成的離屏緩沖區(qū)交換
?著作權(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)容