真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

ios開發(fā)opengl,iOS開發(fā)框架

iOS中的OpenGL:基礎(chǔ)概念

無論是OpenGL 還是 OpenGL ES 或者 Metal ,本質(zhì)上還是利用GPU來進(jìn)行高效的渲染圖形圖像。

創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括泗縣網(wǎng)站建設(shè)、泗縣網(wǎng)站制作、泗縣網(wǎng)頁制作以及泗縣網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,泗縣網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到泗縣省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

換句話說圖形API,是我們iOS開發(fā)者唯一接近GPU的方式。

首先,“狀態(tài)機(jī)”這個東西是什么,學(xué)過編譯原理的同學(xué),一定聽過或了解這三個字。 狀態(tài)機(jī)是有限狀態(tài)自動機(jī)的簡稱,是現(xiàn)實(shí)事物運(yùn)行規(guī)則抽象而成的一個數(shù)學(xué)模型。

如果說下圖“自動門”是個狀態(tài)機(jī),他 記憶 了open和close狀態(tài),知道自己處在不同狀態(tài)時(shí),下一步要干什么,是“開門”還是“關(guān)門”。 當(dāng)在close狀態(tài)時(shí),你 輸入 一個開門的信號,他就會切換成open狀態(tài)

狀態(tài)機(jī)的特點(diǎn):

回到 OpenGL 狀態(tài)機(jī):

iOS開發(fā)快速了解OpenGL基本概念

??作為一個一個iOS底層開發(fā)小白,一直以來對于底層原理,都是一知半解的狀態(tài),希望從此時(shí)記錄自己學(xué)習(xí)底層知識的過程,也希望對其他開發(fā)中可以有一個好的幫助,因?yàn)樽约嚎雌渌说牟┛蜁r(shí)候,大多數(shù)作者都是基于自己認(rèn)知的前提下,記錄自己的知識,在我看來對于入門的人來說,非常晦澀難懂,所以希望自己的文章,可以更加幫助其他人循序漸進(jìn)的了解更多關(guān)于 iOS 的知識。文章也會盡量一步步的探索更多業(yè)務(wù)開發(fā)之外的東西,對于任何方面的技能,都可以友善的幫助后來的開發(fā)者。文章中有任何錯誤,不恰當(dāng)?shù)牡胤?,歡迎隨時(shí)指正,多多交流才可以共同進(jìn)步。想要學(xué)習(xí) OpenGL 首先需要了解 OpenGL/OpenGL ES/Metal 三者之間的聯(lián)系:

??通俗來講就是, Apple 作為大廠,肯定要發(fā)展自己的底層渲染技術(shù),所以推出了 Metal ,在推出 Metal 之前,蘋果的底層渲染也是基于 OpenGL/OpenGL ES 的,在 iOS 12.0以后,蘋果摒棄了 OpenGL 的相關(guān) API ,使用 Metal 作為自己的渲染技術(shù),但是 OpenGL 相關(guān)的 API 依然可以使用,因?yàn)樵?Metal 之前,蘋果提供了非常豐富的關(guān)于使用 OpenGL 相關(guān) API ,類似于蘋果推出了 swift ,但是 OC 依然是自己主流語言一樣。了解了相關(guān)的背景,我們接下來要知道圖形 API 究竟是用來解決什么樣的問題存在的。

?? OpenGL/OpenGL ES/Metal 在任何項(xiàng)目中解決問題的本質(zhì)就是利用 GPU 芯片來高效的渲染圖形圖像。圖形 API 是 iOS 開發(fā)者唯一接近 GPU 的方式。想要了解 OpenGL 就要先學(xué)習(xí)關(guān)于 OpenGL 的專業(yè)名詞,了解了這些,才可以對以后的學(xué)習(xí),有更加深刻的認(rèn)識。

??狀態(tài)機(jī)在 OpenGL 可以這么理解, OpenGL 可以記錄自己的狀態(tài)(當(dāng)前所使用的顏色、是否開啟了混合功能等),可以接輸入(當(dāng)調(diào)用 OpenGL 函數(shù)的時(shí)候,實(shí)際上可以看成 OpenGL 在接受我們的輸入),如我們調(diào)用 glColor3f ,則 OpenGL 接收到這個輸入后會修改自己的“當(dāng)前顏色”這個狀態(tài), OpenGL 可以進(jìn)入停止?fàn)顟B(tài),不再接收輸入。在程序退出前, OpenGL 總會先停止工作;

??這里有一個 iOS 中很經(jīng)常聽到的概念, 離屏渲染 ,很多人知道離屏渲染會對 APP 的性能造成較大的開銷,但是卻不知道原理是什么,相信大家了解了上面關(guān)于 OpenGL 關(guān)于交換緩沖區(qū)的概念后,有了一個更清晰的認(rèn)識,即: Off-Screen Rendering 是需要開辟新的緩沖區(qū)的,不停地切換上下文的環(huán)境則是對性能的很大的消耗,所以在 iOS 開發(fā)中,我們應(yīng)當(dāng)盡量的避免離屏渲染。

??在學(xué)習(xí) OpenGL 的過程中,直接非常直觀的掌握并理解這些概念并不是一件容易的事,但是至少需要在入門階段,大致的了解這些概念的意思,然后通過后續(xù)的學(xué)習(xí),慢慢的鞏固前面學(xué)到的知識,溫故而知新,一步步的打開關(guān)于 iOS 底層渲染知識的大門,學(xué)習(xí)的越來越深入,慢慢的回過頭看以前的知識點(diǎn)的時(shí)候,就會豁然開朗了。

??希望能一步步的記錄自己學(xué)習(xí)的過程,慢慢進(jìn)步,慢慢成長,文章中有任何錯誤的地方,歡迎指正。希望能多多交流,共同進(jìn)步。

OpenGL入門 - 1

簡單來說就是實(shí)現(xiàn)圖形的底層渲染

A. 比如在游戲開發(fā)中,對于游戲場景/游戲人物的渲染

B. 比如在音視頻開發(fā)中,對于視頻解碼后的數(shù)據(jù)渲染

C. 比如在地圖引擎,對于地圖上的數(shù)據(jù)渲染

D. 比如在動畫中,實(shí)現(xiàn)動畫的繪制

E. 比如在視頻處理中,對于視頻加上濾鏡效果

OpenGL/OpenGL ES/Metal 在任何項(xiàng)目中解決問題的本質(zhì)就是利用 GPU 芯片來高效渲染圖形圖像。

圖形 API 是 ios 開發(fā)者唯一接近 GPU 的方式。

OpenGL 階段:

OpenGL ES 階段:

Metal 階段:

固定管線/存儲著?器

頂點(diǎn)數(shù)據(jù)是由CPU/GPU來處理?

頂點(diǎn)緩存區(qū):區(qū)域(不在內(nèi)存!-顯卡顯存中。)

片元著色器

像素著色器

片元函數(shù)

GPUImage

[-1,1]標(biāo)準(zhǔn)化設(shè)備坐標(biāo)系(NDC)

物體/世界/照相機(jī)空間-右手系

規(guī)范化設(shè)備坐標(biāo):左手系。

x,y,z = 0,1,2

注意OpenGL中坐標(biāo)系 OpenGL中的物體,世界,照相機(jī)坐標(biāo)系都屬于右手坐標(biāo)系,而規(guī)范化設(shè)備坐標(biāo)系(NDC)屬于左手坐標(biāo)系。籠統(tǒng)的說OpenGL使用右手坐標(biāo)系是不合適的

OpenGL希望每次頂點(diǎn)著色后,我們的可見頂點(diǎn)都為標(biāo)準(zhǔn)化設(shè)備坐標(biāo)系 (Normalized Device Coordinate, NDC)。也就是說每個頂點(diǎn)的x,y,z都應(yīng)該在-1到1之間,超出這個范圍的頂點(diǎn)將是不可見的。

通常情況下我們會自己設(shè)定一個坐標(biāo)系范圍,之后再在頂點(diǎn)著色器中將這些坐標(biāo)系變換為標(biāo)準(zhǔn)化設(shè)備坐標(biāo),然后這些標(biāo)準(zhǔn)化設(shè)備坐標(biāo)傳入光柵器(Rasterizer),將他們變換為屏幕上的二維坐標(biāo)和像素。

將坐標(biāo)變換為標(biāo)準(zhǔn)化設(shè)備坐標(biāo),接著再轉(zhuǎn)化為屏幕坐標(biāo)的過程通常是分布進(jìn)行的,也是類似于流水線那樣。在流水線中,物體的頂點(diǎn)在最終轉(zhuǎn)化為屏幕坐標(biāo)之前還會被變換到多個坐標(biāo)系系統(tǒng)(Coordinate System)。將物體的坐標(biāo)變到幾個過渡坐標(biāo)系(Intermediate Coordinate System)的優(yōu)點(diǎn)在于 在這些特定的坐標(biāo)系統(tǒng)中,一些操作或運(yùn)算更加方便和容易,這一點(diǎn)很快就變得明顯。對我們來說比較重要的總共有5個不同的坐標(biāo)系統(tǒng)。

這是一個頂點(diǎn)在最終被轉(zhuǎn)化為片段之前需要經(jīng)歷的所有不同的狀態(tài)。為了將坐標(biāo)從一個坐標(biāo)系變換到另一個坐標(biāo)系,我們需要用到幾個變換矩陣,最重要的幾個分別是 模型(Model)、觀察(View)、投影(Projection)三個矩陣。

物體頂點(diǎn)的起始坐標(biāo)在局部空間(Local Space),這里稱為局部坐標(biāo)(Local Coordinate),他在之后在變成世界坐標(biāo)(World Coordinate),觀察坐標(biāo)(View Coordinate),裁剪坐標(biāo)(Clip Coordinate),并最后轉(zhuǎn)為屏幕坐標(biāo)(Screen Coordinate)

的形式結(jié)束。

物體坐標(biāo)系: 每個物體都有他獨(dú)立的坐標(biāo)系,當(dāng)物理移動或者改變方向時(shí)。該物體相關(guān)聯(lián)的坐標(biāo)系將隨之移動或改變方向。

物體坐標(biāo)系是以物體本身而言,比如,我先向你發(fā)指令,”向前走一步“,是向你的物體坐標(biāo)系發(fā)指令。我并不知道你會往哪個絕對的方向移動。比如說,當(dāng)你開車的時(shí)候,有人會說向左轉(zhuǎn),有人會說向東。但是,向左轉(zhuǎn)是物體坐標(biāo)系的概念,而向東則是世界坐標(biāo)系概念。

在某種情況下,我們可以理解物體坐標(biāo)系為模型坐標(biāo)系。因?yàn)槟P晚旤c(diǎn)的坐標(biāo)都是在模型坐標(biāo)系中描述的。

照相機(jī)坐標(biāo)系: 照相機(jī)坐標(biāo)系是和觀察者密切相關(guān)的坐標(biāo)系。照相機(jī)坐標(biāo)系和屏幕坐標(biāo)系相似,差別在于照相機(jī)坐標(biāo)系處于3D空間中,而屏幕坐標(biāo)系在2D平面里。

為什么要引入慣性坐標(biāo)系? 因?yàn)槲矬w坐標(biāo)系轉(zhuǎn)換到慣性坐標(biāo)系只需要旋轉(zhuǎn),從慣性坐標(biāo)系轉(zhuǎn)換到世界坐標(biāo)系只需要平移。

OpenGL最終的渲染設(shè)備是2D的,我們需要將3D表示的場景轉(zhuǎn)換為最終的2D形式,前面使用模型變換和視覺變換將物體坐標(biāo)轉(zhuǎn)到照相機(jī)坐標(biāo)系后,需要進(jìn)行投影變換,將坐標(biāo)從照相機(jī)坐標(biāo)系轉(zhuǎn)換為裁剪坐標(biāo)系,經(jīng)過透視除法后,變換到規(guī)范化設(shè)備坐標(biāo)系(NDC),最后進(jìn)行視口變換后,3D坐標(biāo)才變換到屏幕上的2D坐標(biāo),這個過程入下圖:

在上面的圖中, 注意,OpenGL只定義了裁剪坐標(biāo)系、規(guī)范化設(shè)備坐標(biāo)系、屏幕坐標(biāo)系,而局部坐標(biāo)系、世界坐標(biāo)系、照相機(jī)坐標(biāo)系都是為了方便用戶設(shè)計(jì)而自定義的坐標(biāo)系,他們的關(guān)系如下圖:

OpenGL 然后對裁剪坐標(biāo)執(zhí)行透視除法從而將他們變換到標(biāo)準(zhǔn)化設(shè)備坐標(biāo)。 OpenGL 會使用glViewPort內(nèi)部的參數(shù)來將標(biāo)準(zhǔn)化設(shè)備坐標(biāo)映射到屏幕坐標(biāo),每個坐標(biāo)關(guān)聯(lián)一個屏幕上的點(diǎn)。這個過程稱為視口變換

局部坐標(biāo)系(模型坐標(biāo)系)是為了方便構(gòu)造模型而設(shè)立的坐標(biāo)系,建立模型時(shí)我們無需關(guān)心最終對象顯示在屏幕那個位置。

模型變換的主要目的是通過變換使得用頂點(diǎn)屬性定義或者3d建模軟件構(gòu)造的模型,能夠按照需要,通過縮小、平移等操作放置到場景中合適的位置, 通過模型變換后,物體放置在一個全局的世界坐標(biāo)系中,世界坐標(biāo)系是所有物體交互的一個公共坐標(biāo)系

視變換是為了方便觀察場景中物體而建立的坐標(biāo)系,在這個坐標(biāo)系中相機(jī)是個假設(shè)的概念,是為了便于計(jì)算而引入的。相機(jī)坐標(biāo)系中的坐標(biāo),就是從相機(jī)的角度來解釋世界坐標(biāo)系中的位置

OpenGL中相機(jī)始終位于原點(diǎn),指向 -Z軸,而以相反的方式來調(diào)整場景中物體,從而達(dá)到相同的觀察效果。例如要觀察-Z軸方向的一個立方體的右側(cè)面,可以有兩種方式:

GLShaderManager的初始化

GLShaderManager shaderManager;

shaderManager.InitializeStockShaders();

iOS開發(fā)之初識OpenGL

既然有了 Metal 我們是否還有學(xué)習(xí) OpenGL ES 的必要呢.我個人認(rèn)為暫時(shí)還是有必要的.OpenGL /OpenGL ES/ Metal 在任何項(xiàng)目中解決問題的本質(zhì)就是利用GPU芯片來?效渲染圖形圖像.所以它們底層的原理相近,首先了解OpenGL之后再去了解Metal會更加容易, 其二OpenGL是跨平臺的框架.保不齊以后會在其他的地方用到,所謂技多不壓身.畢竟不可能保證一直都做蘋果開發(fā)吧.

理論枯燥且乏味, 但是我們聯(lián)想一下flutter開發(fā)中用到的context, iOS開發(fā)中CoreGraphics里也有用到context. 是不是此時(shí)心中就有了一定的答案.我個人理解其設(shè)計(jì)模式大同小異. 顧名思義我們能夠通過context拿到很多必要的狀態(tài)和數(shù)據(jù).

比如需要顯示一個正方形, 則需要兩個正等邊三角形圖元來完成

為了讀取效率起見, 提前分配一塊顯存, 將頂點(diǎn)數(shù)組存放在顯存中. 這部分顯存就叫做 頂點(diǎn)緩沖區(qū)

OpenGL渲染的過程中會經(jīng)歷很多節(jié)點(diǎn). 這些節(jié)點(diǎn)串起來就是管線.

常見的著?器主要有: 頂點(diǎn)著?器(VertexShader) , ?段著?器(FragmentShader) , 幾何著?(GeometryShader) , 曲?細(xì)分著?器(TessellationShader)

OpenGL ES 中只?持 頂點(diǎn)著?器 和 片段著?器 .

光柵化就是把頂點(diǎn)數(shù)據(jù)轉(zhuǎn)換為片元的過程。片元中的每一個元素對應(yīng)于幀緩沖區(qū)中的一個像素。

如果把渲染比作是畫畫, 那么頂點(diǎn)著色器操作相當(dāng)與確定畫的內(nèi)容的框架. 而之后往框架里填充內(nèi)容的過程就是光柵化.

填充好內(nèi)容之后就是片元著色器操作像素點(diǎn)填充顏色等操作

這里附上一張流程圖:

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

怎么在ios開發(fā)中使用opengl

一、搭建開發(fā)環(huán)境

1. 打開Xcode, 新建一個工程

選擇:IOS - Application - Single View Application模板

輸入工程名稱和基本信息,勾選“UseStoryboards”,然后創(chuàng)建

2. 添加必要的框架

在“Build Phases”中,添加三個框架

3. 修改viewController。h

添加 “#import”,并將它修改為繼承"GLKViewController"

4. 修改“view”的類

雙擊“MainStoryboard.storyboard”展開,選擇"view"

然后,在“Identity Inspector"中,將它的類改為”GLKView“

好了,OpenGL的環(huán)境基本上搭建出來了。

二、增加自己代碼

基本上,所有的代碼都是加到ViewController.m文件中

1、添加全局屬性聲明

@interface ViewController ()@property(strong,nonatomic)EAGLContext*

context;@property(strong,nonatomic)GLKBaseEffect* effect;@end@implementation

ViewController@synthesize context, effect;

2、 添加一組頂點(diǎn)數(shù)據(jù)

這是一個正方形頂點(diǎn)數(shù)組。實(shí)際上它是二個三角形接合而成的

GLfloat squareVertexData[48] ={ 0.5f, 0.5f, -0.9f, 0.0f, 0.0f, 1.0f, 1.0f,

1.0f, -0.5f, 0.5f, -0.9f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.5f, -0.5f, -0.9f,

0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.5f, -0.5f, -0.9f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,

-0.5f, 0.5f, -0.9f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, -0.5f, -0.5f, -0.9f, 0.0f,

0.0f, 1.0f, 1.0f, 1.0f,};

每行頂點(diǎn)數(shù)據(jù)的排列含義是:

頂點(diǎn)X、頂點(diǎn)Y,頂點(diǎn)Z、法線X、法線Y、法線Z、紋理S、紋理T。

在后面解析此數(shù)組時(shí),將參考此規(guī)則。

頂點(diǎn)位置用于確定在什么地方顯示,法線用于光照模型計(jì)算,紋理則用在貼圖中。

一般約定為“頂點(diǎn)以逆時(shí)針次序出現(xiàn)在屏幕上的面”為“正面”。

世界坐標(biāo)是OpenGL中用來描述場景的坐標(biāo),Z+軸垂直屏幕向外,X+從左到右,Y+軸從下到上,是右手笛卡爾坐標(biāo)系統(tǒng)。我們用這個坐標(biāo)系來描述物體及光源的位置。

三、初始化OpenGL環(huán)境

1、 基本的初始化代碼

在ViewController.m中有個函數(shù)(void)viewDidLoad,它是程序運(yùn)行時(shí),初始化回調(diào)函數(shù)。在viewDidLoad函數(shù)內(nèi)補(bǔ)充我們自己的初始化代碼。

// 使用“ES2”創(chuàng)建一個“EAGLEContext”實(shí)例 self.context = [[[EAGLContext

alloc]initWithAPI:kEAGLRenderingAPIOpenGLES2]autorelease]; //

將“view”的context設(shè)置為這個“EAGLContext”實(shí)例的引用。并且設(shè)置顏色格式和深度格式。 GLKView* view =

(GLKView*)self.view; view.context = self.context; view.drawableColorFormat =

GLKViewDrawableColorFormatRGBA8888; view.drawableDepthFormat =

GLKViewDrawableDepthFormat24; //

將此“EAGLContext”實(shí)例設(shè)置為OpenGL的“當(dāng)前激活”的“Context”。這樣,以后所有“GL”的指令均作用在這個“Context”上。隨后,發(fā)送第一個“GL”指令:激活“深度檢測”。

[EAGLContext setCurrentContext:context]; glEnable(GL_DEPTH_TEST); //

創(chuàng)建一個GLK內(nèi)置的“著色效果”,并給它提供一個光源,光的顏色為綠色。 self.effect = [[[GLKBaseEffect

alloc]init]autorelease]; self.effect.light0.enabled = GL_TRUE;

self.effect.light0.diffuseColor = GLKVector4Make(0.0f, 1.0f, 0.0f, 1.0f);

2、 運(yùn)行?,F(xiàn)在應(yīng)該是粉紅色屏幕了(目前場景仍是空的),說明初始化過程沒問題

四、 將項(xiàng)點(diǎn)數(shù)據(jù)寫入能用的頂點(diǎn)屬性存儲區(qū)

1、 寫入過程

首先將數(shù)據(jù)保存進(jìn)GUP的一個緩沖區(qū)中,然后再按一定規(guī)則,將數(shù)據(jù)取出,復(fù)制到各個通用頂點(diǎn)屬性中。

注:如果頂點(diǎn)數(shù)據(jù)只有一種類型(如單純的位置坐標(biāo)),換言之,在讀數(shù)據(jù)時(shí),不需要確定第一個數(shù)據(jù)的內(nèi)存位置(總是從0開始),則不必事先保存進(jìn)緩沖區(qū)。

2、 頂點(diǎn)數(shù)組保存進(jìn)緩沖區(qū)

//

聲明一個緩沖區(qū)的標(biāo)識(GLuint類型)讓OpenGL自動分配一個緩沖區(qū)并且返回這個標(biāo)識的值.綁定這個緩沖區(qū)到當(dāng)前“Context”.最后,將我們前面預(yù)先定義的頂點(diǎn)數(shù)據(jù)“squareVertexData”復(fù)制進(jìn)這個緩沖區(qū)中。

// 注:參數(shù)“GL_STATIC_DRAW”,它表示此緩沖區(qū)內(nèi)容只能被修改一次,但可以無限次讀取。 GLuint buffer;

glGenBuffers(1, buffer); glBindBuffer(GL_ARRAY_BUFFER, buffer);

glBufferData(GL_ARRAY_BUFFER, sizeof(squareVertexData), squareVertexData,

GL_STATIC_DRAW);

3、將緩沖區(qū)的數(shù)據(jù)復(fù)制進(jìn)能用頂點(diǎn)屬性中

glEnableVertexAttribArray(GLKVertexAttribPosition);

glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 4*8,

(char*)NULL + 0);

首先,激活頂點(diǎn)屬性(默認(rèn)它的關(guān)閉的)?!癎LKVertexAttribPosition”是頂點(diǎn)屬性集中“位置Position”屬性的索引。

頂點(diǎn)屬性集中包含五種屬性:位置、法線、顏色、紋理0,紋理1。

它們的索引值是0到4。

激活后,接下來使用“glVertexAttribPointer”方法填充數(shù)據(jù)。


分享題目:ios開發(fā)opengl,iOS開發(fā)框架
本文路徑:http://weahome.cn/article/hopjsp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部