常見的圖形API
OpenGL
(Open Graphics Library
)是一個跨編程語言捎谨、跨平臺的編程圖形程序接口,它將計算機的資源抽象成為一個個OpenGL
的對象甥捺,對這些資源的操作抽象成為一個個的OpenGL
指令OpenCV
(Open Source Computer Vision Library
)OpenCV是一個基于BSD許可(開源)發(fā)行的跨平臺計算機視覺和機器學習軟件庫兆衅,可以運行在Linux烛谊、Windows、Android和Mac OS操作系統(tǒng)上嘉汰。它輕量級而且高效——由一系列 C 函數(shù)和少量 C++ 類構(gòu)成丹禀,同時提供了Python、Ruby、MATLAB等語言的接口双泪,實現(xiàn)了圖像處理和計算機視覺方面的很多通用算法持搜。主要應(yīng)用于識別OpenGL ES
(OpenGL for Embedded Systems
)是OpenGL
三維圖形API的子集,針對手機焙矛、PDA(Personal Digital Assistant)和游戲主機等嵌入式設(shè)備而設(shè)計葫盼,去除了許多不必要和性能較低的API接口DirectX
是由很多API組成,DirectX
并不是單純的圖形API村斟。DirectX
是屬于Windows上的一個多媒體處理框架贫导,不支持Windows以外的平臺,不屬于跨平臺框架蟆盹。DirectX
可分為四大部分:顯示部分孩灯、聲音部分、輸入部分和網(wǎng)絡(luò)部分Metal
是Apple為游戲開發(fā)者推出的新的平臺技術(shù)逾滥,Metal
能夠為3D圖像提高10倍的渲染性能峰档。Metal
是Apple為了解決3D渲染而推出的框架
圖形API對比理解
-
OpenGL
VSOpenGL ES
OpenGL
:往往用于PC圖形圖像渲染處理
OpenGL ES
:移動端(安卓,iOS) -
OpenGL
VSOpenCV
OpenGL
:渲染(以位圖顯示)
OpenCV
:識別(人臉識別/身份識別/物體識別) -
OpenGL ES
VSMetal
2018年之前Apple移動端的渲染(CoreAnimation
)是基于OpenGL ES
封裝的框架寨昙,2018開始底層的渲染遷移到Metal
讥巡,目前Metal
是無法完成跨平臺。對于Apple來說OpenGL ES
是一個第三方框架舔哪,核心渲染處理肯定會被Metal
逐步取代欢顷。Metal
是調(diào)用GPU來進行運行(GPU并發(fā)運算,編碼解碼尸红,識別吱涉,大量并發(fā)運算,開發(fā)更多的自定義入口外里,更多的利用GPU)
OpenGL上下文(context)
- 在應(yīng)用程序調(diào)用任何OpenGL的指令之前怎爵,需要安排首先創(chuàng)建一個OpenGL的
context
。這個context
是一個非常龐大的狀態(tài)機盅蝗,保存了OpenGL的各種狀態(tài)鳖链,這也是OpenGL指令執(zhí)行的基礎(chǔ) - OpenGL的函數(shù)不管在哪個語言中,都是類似C語言一樣的面向過程函數(shù)墩莫,本事上都是對OpenGL
context
這個龐大的狀態(tài)機中的某個狀態(tài)或者對象進行操作芙委,你得首先把這個對象設(shè)置為當前對象。因此狂秦,通過對OpenGL指令的封裝灌侣,是可以將OpenGL的相關(guān)調(diào)用封裝成一個面向?qū)ο蟮膱D形API - 由于OpenGL
context
是一個巨大的狀態(tài)機,切換context
往往會產(chǎn)生江大的開銷裂问,但是不同的繪制模板侧啼,可能需要使用完全的狀態(tài)管理牛柒。因此,可以在應(yīng)用程序中分別創(chuàng)建多個不同的context
痊乾,在不同的線程中使用不同的context
皮壁,context
之間共享紋理、緩沖區(qū)等資源哪审。這樣的方案蛾魄,會比反復切換context
,或者大量修改渲染狀態(tài)湿滓,更加合適高效滴须。
OpenGL狀態(tài)機
- 狀態(tài)機理論上是一個機器。狀態(tài)機秒速了一個對象在其生命周期內(nèi)經(jīng)理的各種狀態(tài)茉稠,狀態(tài)的莊邊的動因描馅、條件及轉(zhuǎn)變中所執(zhí)行的活動。
- 有記憶功能
- 可以接受輸入而线,根據(jù)輸入的內(nèi)容和自己的原先狀態(tài)铭污,修改自己當前狀態(tài),并可以有對應(yīng)輸出
- 當進入特殊狀態(tài)(停機)的時候膀篮,便不再接收輸入嘹狞,并停止工作
渲染
-
Rendering
將圖形/圖像數(shù)據(jù)轉(zhuǎn)換成2D空間圖像操作叫做渲染
頂點數(shù)組和頂點緩沖區(qū)
-
VertexArray
和Vertexbuffer
- 繪圖的時候需要先確定圖形顯示的區(qū)域,而確定這些區(qū)域所構(gòu)成的頂點數(shù)據(jù)集合在內(nèi)存中被稱為
VertexArray
誓竿。OpenGL中的圖像都是由土元組成磅网,在OpenGL ES中,有三種類型的圖元:點
筷屡、線
涧偷、三角形
; - 高效的做法是我們可以提前分配一塊顯存將
VertexArray
傳入其中。這部分顯存我們稱為Vertexbuffer
- 繪圖的時候需要先確定圖形顯示的區(qū)域,而確定這些區(qū)域所構(gòu)成的頂點數(shù)據(jù)集合在內(nèi)存中被稱為
位圖
- JPG/PNG 都是壓縮圖片
- 位圖是壓縮圖片解壓之后通過像素點顯示
管線
- 在OpenGL下渲染圖形毙死,就會經(jīng)歷?個?個的節(jié)點燎潮。而這樣的操作可以理理解管線。管線是?個抽象的概念扼倘,之所以稱之為管線是因為顯卡在處理數(shù)據(jù)的時候是按照一個固定的順序來的确封,而且嚴格按照這個順序。
- 固定管線:不可以進行自定義操作再菊,只能用現(xiàn)有的
- 可編程管線:自定義造輪子
著色器
-
Shader
給GPU使用的代碼段- 固定
Shader
:(存儲著色器)蘋果提供的API代碼段爪喘,調(diào)用參數(shù)OpenGL提供 - 固定著色器:自定義代碼段(基于GLSL)
- 固定
- 可編輯著色器
- 頂點著色器
VertexShader
:- 確定位置
- 縮放/平移/旋轉(zhuǎn)位置換算
- 手機端顯示3D效果
- 片元著色器
片段著色器FragmentShader 像素著色器PixelShader
- 處理一個一個的像素點,將一個個像素點映射到屏幕上
- 頂點著色器
GLSL(OpenGL Shading Language)
- 自定義著色器->代碼(語言)OpenGL標準調(diào)用GPU來做計算
光柵化(Rasterization)
-
Rasterization
就是把頂點數(shù)據(jù)轉(zhuǎn)換為片元的過程纠拔。具有將圖轉(zhuǎn)化為?個個柵格組成的圖象 的作?秉剑,特點是每個元素對應(yīng)幀緩沖區(qū)中的?像素。 -
Rasterization
其實是?種將?何圖元變?yōu)槎S圖像的過程稠诲。該過程包含了兩部分的?作秃症。- 第?部分工作:決定窗?坐標中的哪些整型柵格區(qū)域被基本圖元占?候址;
- 第?部分?作:分配一個顏?值和?個深度值到各個區(qū)域
- 把物體的數(shù)學描述以及與物體相關(guān)的顏色信息轉(zhuǎn)換為屏幕上用于對應(yīng)位置的像素及?于填充像素的顏?吕粹,這個過程稱為光柵化种柑。這是?個將模擬信號轉(zhuǎn)化為離散信號的過程。
紋理
-
紋理
可以理解為圖片匹耕。渲染圖形式需要在其編碼填充圖片聚请,為了是場景更加逼真,而這里使用的圖片稳其,就是常說的的紋理
混合(Blending)
- 在測試階段之后驶赏,如果像素依然沒有被剔除,那么像素的顏?將會和幀緩沖區(qū)中顏?附著上的顏色進?混合既鞠,
混合
的算法可以通過OpenGL的函數(shù)進行指定煤傍。但是OpenGL提供的混合算法
有限。如果需要更加復雜的混合算法
嘱蛋,一般可以通過片段著?器進?實現(xiàn)蚯姆,當然性能會?原?的混合算法
差?些。(像素疊加的算法)
變幻矩陣(Transformation)
- 圖形僅為位置變幻(平移洒敏、縮放龄恋、旋轉(zhuǎn))需要使用
Transformation
投影矩陣(Prejection)
- 用于將3D坐標轉(zhuǎn)換成為二維屏幕坐標,實際線條也將在二維坐標下進行繪制