欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

ios開發(fā)opengl,iOS開發(fā)者中心

OpenGL入門 - 1

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

創(chuàng)新互聯(lián)公司專注于中大型企業(yè)的成都做網(wǎng)站、網(wǎng)站建設(shè)和網(wǎng)站改版、網(wǎng)站營(yíng)銷服務(wù),追求商業(yè)策劃與數(shù)據(jù)分析、創(chuàng)意藝術(shù)與技術(shù)開發(fā)的融合,累計(jì)客戶上1000家,服務(wù)滿意度達(dá)97%。幫助廣大客戶順利對(duì)接上互聯(lián)網(wǎng)浪潮,準(zhǔn)確優(yōu)選出符合自己需要的互聯(lián)網(wǎng)運(yùn)用,我們將一直專注成都品牌網(wǎng)站建設(shè)和互聯(lián)網(wǎng)程序開發(fā),在前進(jìn)的路上,與客戶一起成長(zhǎng)!

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

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

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

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

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

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

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

OpenGL 階段:

OpenGL ES 階段:

Metal 階段:

固定管線/存儲(chǔ)著?器

頂點(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)。也就是說每個(gè)頂點(diǎn)的x,y,z都應(yīng)該在-1到1之間,超出這個(gè)范圍的頂點(diǎn)將是不可見的。

通常情況下我們會(huì)自己設(shè)定一個(gè)坐標(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)之前還會(huì)被變換到多個(gè)坐標(biāo)系系統(tǒng)(Coordinate System)。將物體的坐標(biāo)變到幾個(gè)過渡坐標(biāo)系(Intermediate Coordinate System)的優(yōu)點(diǎn)在于 在這些特定的坐標(biāo)系統(tǒng)中,一些操作或運(yùn)算更加方便和容易,這一點(diǎn)很快就變得明顯。對(duì)我們來說比較重要的總共有5個(gè)不同的坐標(biāo)系統(tǒng)。

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

物體頂點(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)系: 每個(gè)物體都有他獨(dú)立的坐標(biāo)系,當(dāng)物理移動(dòng)或者改變方向時(shí)。該物體相關(guān)聯(lián)的坐標(biāo)系將隨之移動(dòng)或改變方向。

物體坐標(biāo)系是以物體本身而言,比如,我先向你發(fā)指令,”向前走一步“,是向你的物體坐標(biāo)系發(fā)指令。我并不知道你會(huì)往哪個(gè)絕對(duì)的方向移動(dòng)。比如說,當(dāng)你開車的時(shí)候,有人會(huì)說向左轉(zhuǎn),有人會(huì)說向東。但是,向左轉(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表示的場(chǎng)景轉(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),這個(gè)過程入下圖:

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

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

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

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

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

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

GLShaderManager的初始化

GLShaderManager shaderManager;

shaderManager.InitializeStockShaders();

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

??作為一個(gè)一個(gè)iOS底層開發(fā)小白,一直以來對(duì)于底層原理,都是一知半解的狀態(tài),希望從此時(shí)記錄自己學(xué)習(xí)底層知識(shí)的過程,也希望對(duì)其他開發(fā)中可以有一個(gè)好的幫助,因?yàn)樽约嚎雌渌说牟┛蜁r(shí)候,大多數(shù)作者都是基于自己認(rèn)知的前提下,記錄自己的知識(shí),在我看來對(duì)于入門的人來說,非?;逎y懂,所以希望自己的文章,可以更加幫助其他人循序漸進(jìn)的了解更多關(guān)于 iOS 的知識(shí)。文章也會(huì)盡量一步步的探索更多業(yè)務(wù)開發(fā)之外的東西,對(duì)于任何方面的技能,都可以友善的幫助后來的開發(fā)者。文章中有任何錯(cuò)誤,不恰當(dāng)?shù)牡胤剑瑲g迎隨時(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è)名詞,了解了這些,才可以對(duì)以后的學(xué)習(xí),有更加深刻的認(rèn)識(shí)。

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

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

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

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

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

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

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

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

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

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

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

iOS開發(fā)之初識(shí)OpenGL

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

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

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

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

OpenGL渲染的過程中會(huì)經(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)換為片元的過程。片元中的每一個(gè)元素對(duì)應(yīng)于幀緩沖區(qū)中的一個(gè)像素。

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

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

這里附上一張流程圖:

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

名稱欄目:ios開發(fā)opengl,iOS開發(fā)者中心
文章鏈接:http://chinadenli.net/article12/hohodc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、域名注冊(cè)、小程序開發(fā)、網(wǎng)站設(shè)計(jì)公司外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

營(yíng)銷型網(wǎng)站建設(shè)