狀態(tài)機(jī)
可以理解為一個保存對象當(dāng)前狀態(tài)令野,且可以根據(jù)輸入修改當(dāng)前狀態(tài)進(jìn)行響應(yīng)的機(jī)器
特點
- 記憶功能:保存當(dāng)前狀態(tài)(如使用顏色、混合功能是否開啟等)
- 接收輸入:根據(jù)輸入修改當(dāng)前狀態(tài),且有相應(yīng)輸出
- 進(jìn)入停機(jī)狀態(tài)時棉安,不再接受輸入,且停止工作
上下文 Context
- 一個保存OpenGL中各種狀態(tài)的龐大狀態(tài)機(jī)铸抑,
- 是OpenGL指令執(zhí)行的基礎(chǔ)贡耽,需要在調(diào)用指令之前創(chuàng)建
OpenGL函數(shù) 與 上下文
- 不論何種語言,OpenGL函數(shù)都是面向過程的函數(shù)
- 函數(shù)本質(zhì):對context中某個狀態(tài)/對象進(jìn)行操作
- 可以通過對OpenGL指令的封裝鹊汛,將OpenGL的相關(guān)函數(shù)調(diào)用封裝成一個面向?qū)ο蟮膱D形API
問題:反復(fù)上下文切換/大量修改渲染狀態(tài)蒲赂,導(dǎo)致GPU開銷較大
- 針對不同模塊,創(chuàng)建不同的context進(jìn)行狀態(tài)管理刁憋,context之間共享紋理滥嘴、緩沖區(qū)等資源
渲染 Rendering
將圖形/圖像數(shù)據(jù)通過解碼,將其顯示繪制到屏幕上的操作
頂點數(shù)組 VertexArray至耻、頂點緩沖區(qū) VertexBuffer
頂點:繪制圖形時頂點位置的數(shù)據(jù)
OpenGL ES中的圖元類型
屏幕中的所有圖形/圖像若皱,都是由這三種圖元組合而成的
- 點
- 線
- 三角形
頂點數(shù)據(jù)存儲方式
頂點數(shù)組與頂點緩沖區(qū)的區(qū)別在于頂點數(shù)據(jù)的存儲方式不同
- 存儲在內(nèi)存中镊叁,即 【頂點數(shù)組】
- 存儲在GPU提前分配的顯存中,即 【頂點緩沖區(qū)】
管線
可以理解為流水線走触,該流水線有一個固定順序的操作晦譬,需要按著這個順序一個個執(zhí)行
固定管線/存儲著色器
- 一個已經(jīng)封裝好的Shader程序,開發(fā)者使用時互广,只需要傳入相應(yīng)參數(shù)敛腌,即可快速完成渲染,類似蘋果系統(tǒng)中封裝好的API
- 當(dāng)固定管線無法完成每個業(yè)務(wù)時惫皱,需要將與業(yè)務(wù)相關(guān)的部分變成可編程像樊,用戶根據(jù)需要自定義管線來完成業(yè)務(wù)
- 目前OpenGL中可編程的僅有兩個程序:頂點著色器、片元著色器
頂點著色器
- OpenGL中用來處理頂點相關(guān)代碼的程序
- 將頂點坐標(biāo)由 自身坐標(biāo)系 轉(zhuǎn)換到 歸一坐標(biāo)系
- 是逐頂點運(yùn)行的程序旅敷,即每個頂點數(shù)據(jù)都會執(zhí)行一次生棍,且是并行的
操作
- 確定頂點位置
- 處理圖形頂點的變換(旋轉(zhuǎn)、平移扫皱、縮放)
- 3D圖形數(shù)據(jù) 投影換算 為2D圖形數(shù)據(jù)
片元著色器
- 片元:理解為屏幕中的像素點
- 片元著色器主要用于處理一個個的像素點足绅,例如像素顏色的計算和填充
- 逐像素且在GPU并行運(yùn)行的程序,即每個像素都會執(zhí)行一次
舉例說明:圖片飽和度是如何完成的韩脑?
- 通過片元著色器進(jìn)行一個個像素點的修改來實現(xiàn)
GLSL(OpenGL Shading Language)
- OpenGL中著色編程的語言
- 開發(fā)者可以使用該語言氢妈,自定義著色器
光柵化
通過2個步驟產(chǎn)生片元的一個過程
具體描述
- 頂點數(shù)據(jù)轉(zhuǎn)換為片元
- 幾何圖元轉(zhuǎn)化為二維圖像
- 把物體的數(shù)學(xué)描述和相關(guān)的顏色信息轉(zhuǎn)換為屏幕上對應(yīng)位置的像素及填充像素顏色
- 將模擬信號轉(zhuǎn)換為離散信號
- 是不可編程的過程
作用
將圖轉(zhuǎn)化為一個個柵格組成的圖像
特點
每個元素對應(yīng)幀緩沖區(qū)中的一像素
執(zhí)行的操作
- 確定圖形的像素范圍
- 顏色附著上去,即分配一個顏色值和一個深度值到各個區(qū)域
紋理
可以理解為圖片
目的
- 渲染圖形時段多,可以使場景更加逼真
混合 Blending
可以理解為兩個圖形/圖像相交處的顏色首量,該顏色即為兩個圖形/圖像顏色的混合
變換矩陣 Transformation
用于圖形的平移、旋轉(zhuǎn)进苍、縮放時使用
投影矩陣 Projection
將3D坐標(biāo)轉(zhuǎn)換為2D屏幕坐標(biāo)時使用
渲染上屏/交換緩沖區(qū) SwapBuffer
- 渲染緩沖區(qū):可以理解為是系統(tǒng)的資源加缘,例如窗口
- 渲染上屏:將圖像直接渲染到窗口對應(yīng)的渲染緩沖區(qū)
問題:如果每個窗口只有一個緩沖區(qū),在繪制過程中刷新了屏幕觉啊,窗口可能顯示不出完整的圖像
- 常規(guī)OpenGL程序中至少會有兩個緩沖區(qū)
==> 屏幕緩沖區(qū):用于顯示在屏幕上
==> 離屏緩沖區(qū):沒有顯示的
- 在一個緩沖區(qū)渲染完成后拣宏,將屏幕緩沖區(qū)和離屏緩沖區(qū)進(jìn)行交換,實現(xiàn)圖像在屏幕上的顯示
問題:防止交換緩沖區(qū)時屏幕上下區(qū)域的圖像分屬于兩個不同的幀
- 顯示的刷新一般是逐行進(jìn)行的杠人,因此交換一般會等待顯示器刷新完成的信號勋乾,在顯示器兩次刷新的間隔中進(jìn)行交換
==> 信號:垂直同步信號
==> 技術(shù):垂直同步技術(shù)
問題:使?用了了雙緩沖區(qū)和垂直同步技術(shù)之后,由于總是要等待緩沖區(qū)交換之后再進(jìn)行下一幀的渲染嗡善,使得幀率 無法完全達(dá)到硬件允許的最??平
三緩沖區(qū)技術(shù)
- 在等待垂直同步時辑莫,來回交替渲染兩個離屏的緩沖區(qū)
- 垂直同步發(fā)生時,屏幕緩沖區(qū)和最近渲染完成的離屏緩沖區(qū)交換