OpenGL (Open Graphics Library)
一個(gè)跨平臺編程語言慎式,跨平臺的編程圖形程序接口确虱,它將計(jì)算機(jī)的資源抽象為一個(gè)個(gè)OpenGL的對象抢韭,對這些資源的操作抽象為一個(gè)個(gè)的OpenGL指令
OpenGL ES (OpenGL for Embedded Systems)
OpenGL三維圖形AP的子集凳谦,針對手機(jī)念恍、PDA和游戲主機(jī)等嵌入式設(shè)備而設(shè)計(jì)驹尼,去除了許多不必要和性能較低的API接口趣避。
DirectX
由很多API組成的,DirectX并不是一個(gè)單純的圖形API.最重要的是DirectX是屬于windows上一個(gè)多媒體處理框架新翎,并不支持windows以外的平臺.所以不是跨平臺框架.按照性質(zhì)分類程帕,可以分為四大部分,顯示部分地啰、聲音部分愁拭、輸入部分和網(wǎng)絡(luò)部分.
Metal
Apple為游戲開發(fā)者推出了新的平臺技術(shù) Metal,該技術(shù)能夠?yàn)?D圖像提高10倍的渲染性能.Metal是Apple為了解決3D渲染而推出的框架
OpenGL與OpenGL ES的區(qū)別
- OpenGL 主要運(yùn)用于PC端的圖形圖像渲染處理(MAC,windows)
- OpenGL ES 主要運(yùn)用于移動(dòng)端(iOS,Android)
OpenGL與OpenCV的區(qū)別
- OpenGL主要用于渲染(顯示位圖)
- OpenCV主要用于識別(人臉識別、身份識別亏吝、物體—>OpenCV face++)與人工智能結(jié)合
OpenGL ES與Metal的區(qū)別
- Apple 至2018年渲染部分例如CoreAnimation是基于OpenGL ES封裝的上層框架岭埠,2018年后底層渲染遷移到了Metal
- OpenGL ES作為第三方庫沒法契合你項(xiàng)目定制化需求,沒法迭代
- 很多的項(xiàng)目目前還是使用的OpenGL ES (跨平臺蔚鸥,GLSL兼容iOS和Android)
- 替代原因:
4.1 不可能一直把非常重要的渲染核心框架使用第三方
4.2 調(diào)用GPU來進(jìn)行運(yùn)行(GPU并發(fā)運(yùn)算惜论,編碼解碼,識別止喷,大量并發(fā)運(yùn)算馆类,2018年開始通過Metal提供的接口,讓你調(diào)用GPU來自定義事情.借助Metal調(diào)度GPU來給你做運(yùn)算)
圖形API解決什么問題:--->渲染問題
- 系統(tǒng)針對按鈕启盛、圖片、視圖技羔、圖層渲染問題
- 游戲引擎->人物/場景渲染(圖形API)
- 視頻播放方框--->ijkplayer,kxmovie視頻解碼--->渲染(圖形API)
- 核心動(dòng)畫--->動(dòng)畫操作(旋轉(zhuǎn)僵闯、縮放、平移藤滥、圖層特效)
- 視頻/圖片--->特效(圖形API)
- 離屏渲染
OpenGL上下文[context]
在應(yīng)用程序調(diào)用任何OpenGL的指令之前鳖粟,需要安排首先創(chuàng)建一個(gè)OpenGL的上下文。這個(gè)上下文(環(huán)境)是一個(gè)非常龐大的狀態(tài)機(jī)拙绊,保存了OpenGL中的各種狀態(tài),這也是OpenGL指令執(zhí)行的基礎(chǔ)
OpenGL 狀態(tài)機(jī)
類推到OpenGL中來向图,可以這么理解:
OpenGL可以記錄自己的狀態(tài)(如當(dāng)前所使用的顏色,是否開啟了混合功能等)
OpenGL可以接收輸入(當(dāng)調(diào)用OpenGL函數(shù)的時(shí)候标沪,實(shí)際上可以看成OpenGL在接收我們的輸入)榄攀,如果我們調(diào)用glColor3f,則OpenGL接收到這個(gè)輸入后會修改自己的"當(dāng)前顏色"這個(gè)狀態(tài)
OpenGL可以進(jìn)入停止?fàn)顟B(tài),不再接收輸入金句,在程序退出前檩赢,OpenGL總會先停止工作的
OpenGL 渲染
將圖形/圖像數(shù)據(jù)轉(zhuǎn)換成2D空間圖像操作叫做渲染(Rendering)
OpenGL 頂點(diǎn)數(shù)組(VertexArray)
將頂點(diǎn)數(shù)據(jù)存放在內(nèi)存中
OpenGL 頂點(diǎn)緩沖區(qū)(VertexBuffer)
將頂點(diǎn)數(shù)據(jù)存放到GPU的顯存中
png轉(zhuǎn)換為位圖(CoreGraphics)
位圖: 120*120 = 14400 -->RGBA --->14400 *4 = 位圖(紋理)
映射: 對應(yīng)關(guān)系
OpenGL 管線:流水線
//工廠:肥皂 --->肥皂水--->模具--->肥皂塊
固定管線
對應(yīng)非常多的模具(固定著色器)--->結(jié)果
可編程管線
肥皂--->肥皂水--->自定義編程模具(GLSL語法來驅(qū)使GPU來進(jìn)行代碼實(shí)現(xiàn))--->肥皂快(OpenGL ES GLSL)
著色器
函數(shù)/方法(代碼段)--->CPU來使用;shader(代碼段)--->GPU來使用
固定著色器(存儲著色器)
蘋果提供API(代碼段)--->調(diào)用(參數(shù))OpenGL來提供
自定義著色器
進(jìn)行自定義(自己基于GLSL來進(jìn)行編寫代碼段)
頂點(diǎn)著色器
用來處理頂點(diǎn)相關(guān)代碼 (1.確定位置 2. 縮放/平移/旋轉(zhuǎn)位置換算 3.手機(jī)端顯示3D 手機(jī)屏幕實(shí)際2D,3D圖形數(shù)據(jù)--->2D(投影換算)--->OpenGL ES)
片元著色器
片元(像素點(diǎn))著色器违寞,處理一個(gè)一個(gè)像素點(diǎn)贞瞒;120*120 像素點(diǎn).14400次 GPU并行運(yùn)算;(例如圖片進(jìn)行飽和度調(diào)整--->片元著色器進(jìn)行一個(gè)個(gè)像素點(diǎn)修改)--->OpenGL ES
GLSL(OpenGL Shading Language)
自定義著色器--->代碼(語言) OpenGL 標(biāo)準(zhǔn)調(diào)用GPU來做計(jì)算
光柵化(Rasterization不可編程)
是把頂點(diǎn)數(shù)據(jù)轉(zhuǎn)換為片元的過程偶房,具有將圖轉(zhuǎn)化為一個(gè)個(gè)柵格做成的圖像的作用,特點(diǎn)是每個(gè)元素對應(yīng)幀緩沖區(qū)中的一個(gè)像素军浆。
把物體的數(shù)學(xué)描述以及與物體相關(guān)的顏色信息轉(zhuǎn)換為屏幕上用于對應(yīng)位置的像素及用于填充像素的顏色棕洋,這個(gè)過程稱為光柵化
離屏渲染shouldRa--->觸發(fā)離屏渲染
第一個(gè)過程: 決定窗口坐標(biāo)中的哪些整型柵格區(qū)域被基本圖元占用
第二個(gè)過程: 分配一個(gè)顏色值和一個(gè)深度值到各個(gè)區(qū)域.、
紋理
紋理可以理解為圖片乒融,大家在渲染圖形時(shí)需要在其編碼填充圖片掰盘,為了使得場景更加逼真,而這里使用的圖片簇抵,就是常說的紋理庆杜,但是在OpenGL,我們更加習(xí)慣叫紋理,而不是圖片
壓縮圖片--->位圖 OpenGL .tga 紋理文件 OpenGL ES 移動(dòng)端顯示一張 png--->位圖
混合
Layer2個(gè)圖層--->粉紅色0.5碟摆,藍(lán)色0.2 = 疊加在一起 = 顏色混合行為--->離屏渲染 組透明度 --->OpenGL
變換矩陣(Transformation)
例如圖形想發(fā)生平移晃财、縮放、旋轉(zhuǎn)變換典蜕。就需要使用變換矩陣
投影矩陣(Projection)
用于將3D坐標(biāo)轉(zhuǎn)換為二維屏幕坐標(biāo)断盛,實(shí)際線條也將在二維坐標(biāo)下進(jìn)行繪制
投影方式(觀察者視角)
只有兩種
1.正投影(平行投影)圖片繪制不管遠(yuǎn)近1:1進(jìn)行繪制,顯示2D效果
2.透視投影 遠(yuǎn)小近大的效果愉舔,3D圖形
攝像機(jī)坐標(biāo)系
觀察者坐標(biāo)系
物體坐標(biāo)系
物體本身的坐標(biāo)系
世界坐標(biāo)系
所有的物體都在世界坐標(biāo)系范圍內(nèi)