天天看點

一、了解 OpenGL 常見專有名詞狀态機上下文 Context渲染 Rendering頂點數組 VertexArray、頂點緩沖區 VertexBuffer管線頂點着色器片元着色器GLSL(OpenGL Shading Language)光栅化紋理混合 Blending變換矩陣 Transformation投影矩陣 Projection渲染上屏/交換緩沖區 SwapBuffer

OpenGL + OpenGL ES +Metal 系列文章彙總

狀态機

可以了解為一個儲存對象目前狀态,且可以根據輸入修改目前狀态進行響應的機器

特點

  • 記憶功能:儲存目前狀态(如使用顔色、混合功能是否開啟等)
  • 接收輸入:根據輸入修改目前狀态,且有相應輸出
  • 進入停機狀态時,不再接受輸入,且停止工作

上下文 Context

  • 一個儲存OpenGL中各種狀态的龐大狀态機,
  • 是OpenGL指令執行的基礎,需要在調用指令之前建立

OpenGL函數 與 上下文

  • 不論何種語言,OpenGL函數都是面向過程的函數
  • 函數本質:對context中某個狀态/對象進行操作
  • 可以通過對OpenGL指令的封裝,将OpenGL的相關函數調用封裝成一個面向對象的圖形API

問題:反複上下文切換/大量修改渲染狀态,導緻GPU開銷較大

  • 針對不同子產品,建立不同的context進行狀态管理,context之間共享紋理、緩沖區等資源

渲染 Rendering

将圖形/圖像資料通過解碼,将其顯示繪制到螢幕上的操作

頂點數組 VertexArray、頂點緩沖區 VertexBuffer

頂點:繪制圖形時頂點位置的資料

OpenGL ES中的圖元類型

螢幕中的所有圖形/圖像,都是由這三種圖元組合而成的
  • 三角形

頂點資料存儲方式

頂點數組與頂點緩沖區的差別在于頂點資料的存儲方式不同
  • 存儲在記憶體中,即 【頂點數組】
  • 存儲在GPU提前配置設定的顯存中,即 【頂點緩沖區】

管線

可以了解為流水線,該流水線有一個固定順序的操作,需要按着這個順序一個個執行

固定管線/存儲着色器

  • 一個已經封裝好的Shader程式,開發者使用時,隻需要傳入相應參數,即可快速完成渲染,類似蘋果系統中封裝好的API
  • 當固定管線無法完成每個業務時,需要将與業務相關的部分變成可程式設計,使用者根據需要自定義管線來完成業務
  • 目前OpenGL中可程式設計的僅有兩個程式:頂點着色器、片元着色器

頂點着色器

  • OpenGL中用來處理頂點相關代碼的程式
  • 将頂點坐标由 自身坐标系 轉換到 歸一坐标系
  • 是逐頂點運作的程式,即每個頂點資料都會執行一次,且是并行的

操作

  • 确定頂點位置
  • 處理圖形頂點的變換(旋轉、平移、縮放)
  • 3D圖形資料 投影換算 為2D圖形資料

片元着色器

  • 片元:了解為螢幕中的像素點
  • 片元着色器主要用于處理一個個的像素點,例如像素顔色的計算和填充
  • 逐像素且在GPU并行運作的程式,即每個像素都會執行一次

舉例說明:圖檔飽和度是如何完成的?

  • 通過片元着色器進行一個個像素點的修改來實作

GLSL(OpenGL Shading Language)

  • OpenGL中着色程式設計的語言
  • 開發者可以使用該語言,自定義着色器

光栅化

通過2個步驟産生片元的一個過程

具體描述

  • 頂點資料轉換為片元
  • 幾何圖元轉化為二維圖像
  • 把物體的數學描述和相關的顔色資訊轉換為螢幕上對應位置的像素及填充像素顔色
  • 将模拟信号轉換為離散信号
  • 是不可程式設計的過程

作用

将圖轉化為一個個栅格組成的圖像

特點

每個元素對應幀緩沖區中的一像素

執行的操作

  • 确定圖形的像素範圍
  • 顔色附着上去,即配置設定一個顔色值和一個深度值到各個區域

紋理

可以了解為圖檔

目的

  • 渲染圖形時,可以使場景更加逼真

混合 Blending

可以了解為兩個圖形/圖像相交處的顔色,該顔色即為兩個圖形/圖像顔色的混合

變換矩陣 Transformation

用于圖形的平移、旋轉、縮放時使用

投影矩陣 Projection

将3D坐标轉換為2D螢幕坐标時使用

渲染上屏/交換緩沖區 SwapBuffer

  • 渲染緩沖區:可以了解為是系統的資源,例如視窗
  • 渲染上屏:将圖像直接渲染到視窗對應的渲染緩沖區

問題:如果每個視窗隻有一個緩沖區,在繪制過程中重新整理了螢幕,視窗可能顯示不出完整的圖像

  • 正常OpenGL程式中至少會有兩個緩沖區

    ==> 螢幕緩沖區:用于顯示在螢幕上

    ==> 離屏緩沖區:沒有顯示的

  • 在一個緩沖區渲染完成後,将螢幕緩沖區和離屏緩沖區進行交換,實作圖像在螢幕上的顯示

問題:防止交換緩沖區時螢幕上下區域的圖像分屬于兩個不同的幀

  • 顯示的重新整理一般是逐行進行的,是以交換一般會等待顯示器重新整理完成的信号,在顯示器兩次重新整理的間隔中進行交換

    ==> 信号:垂直同步信号

    ==> 技術:垂直同步技術

問題:使⽤用了了雙緩沖區和垂直同步技術之後,由于總是要等待緩沖區交換之後再進行下一幀的渲染,使得幀率 無法完全達到硬體允許的最⾼⽔平

三緩沖區技術
  • 在等待垂直同步時,來回交替渲染兩個離屏的緩沖區
  • 垂直同步發生時,螢幕緩沖區和最近渲染完成的離屏緩沖區交換