unity3d中圖片渲染流程是什么

這篇文章給大家分享的是有關(guān)unity3d中圖片渲染流程是什么的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

長寧網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。創(chuàng)新互聯(lián)成立與2013年到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。

相關(guān)名詞

GPU(Graphic Processor Unit)

圖形處理單元

GLSL(OpenGL Shading Language)著色語言

是用來在OpenGL中著色編程的語言,也即開發(fā)人員寫的短小的自定義程序,他們是在顯卡的 GPU 上執(zhí)行的,代替了固定的渲染管線的一部分,使渲染管線中不同層次具有可編程性。比如:視圖轉(zhuǎn)換、投影轉(zhuǎn)換等。GLSL 的著色器代碼分成2個部分:Vertex Shader(頂點(diǎn)著色器)和Fragment(片斷著色器)

頂點(diǎn)著色器(VertexShader)

一般用來處理圖形每個頂點(diǎn)變換(旋轉(zhuǎn)/平移/投影等)

頂點(diǎn)著色器是OpenGL中用于 計算頂點(diǎn)屬性 的 程序 。頂點(diǎn)著色器是逐頂點(diǎn)運(yùn)算的程序,也就是說 每個頂點(diǎn)數(shù)據(jù)都會執(zhí)行一次頂點(diǎn)著色器,當(dāng)然這是 并行 的,并且頂點(diǎn)著色器運(yùn)算過程中無法訪問其他頂點(diǎn)的數(shù)據(jù)。

一般來說典型的需要計算的頂點(diǎn)屬性主要包括頂點(diǎn)坐標(biāo)變換、逐頂點(diǎn)光照運(yùn)算等等。頂點(diǎn)坐標(biāo)由自身坐標(biāo)系轉(zhuǎn)換到歸一化坐標(biāo)系的運(yùn)算,就是在這里發(fā)生的。

片元著色器程序(FragmentShader)

一般用來處理圖形中每個像素點(diǎn)顏色計算和填充

片段著色器是OpenGL中用于計算片段(像素)顏色的程序。片段著色器是逐像素運(yùn)算的程序,也就是說 每個像素都會執(zhí)行一次片段著色器 ,也是 并行 的。

頂點(diǎn) & 頂點(diǎn)數(shù)據(jù)

頂點(diǎn)指的是我們在繪制一個圖形時它的頂點(diǎn)位置數(shù)據(jù)。這個數(shù)據(jù)可以直接存儲在數(shù)組中或者將其緩存到GPU內(nèi)存中。

畫圖一般是先畫好圖像的骨架,然后再往骨架里面填充顏色。頂點(diǎn)數(shù)據(jù)就是圖像的骨架,OpenGL中的圖像都是由圖元組成。在OpenGLES中,有3種類型的圖元:點(diǎn)、線、三角形。

頂點(diǎn)數(shù)組(VertexArray) & 頂點(diǎn)緩沖區(qū)(VertexBuffer)

開發(fā)者可以選擇設(shè)定函數(shù)指針,在調(diào)用繪制方法的時候,直接由內(nèi)存?zhèn)魅腠旤c(diǎn)數(shù)據(jù),也就是說這部分?jǐn)?shù)據(jù)之前是存儲在 內(nèi)存 當(dāng)中的,被稱為 頂點(diǎn)數(shù)組 。而性能更高的做法是,提前分配一塊 顯存 ,將頂點(diǎn)數(shù)據(jù)預(yù)先傳入到顯存當(dāng)中。這部分的顯存,就被稱為 頂點(diǎn)緩沖區(qū) 。

光柵化(Rasterization)

是把 頂點(diǎn)數(shù)據(jù)轉(zhuǎn)換為片元的過程 ,將圖轉(zhuǎn)化為一個個柵格組成的圖象。把物體的數(shù)學(xué)描述以及與物體相關(guān)的顏色信息轉(zhuǎn)換為屏幕上用于對應(yīng)位置的像素及用于填充像素的顏色。

光柵化包含了兩部分的工作。第一:決定窗口坐標(biāo)中的哪些整型柵格區(qū)域被基本圖元占用;第二:分配一個顏色值和一個深度值到各個區(qū)域。

紋理

可以理解為圖片。

圖片加載的工作流程

UIImage *image = [UIImage imageWithContentsOfFile:@"filePath"];

從磁盤中加載一張圖片,這個時候的圖片并沒有解壓縮;

imageView.image = image;

然后將生成的 UIImage 賦值給 UIImageView ,這一步確認(rèn)顯示圖片,CPU 才開始解碼;

接著一個隱式的 CATransaction 捕獲到了 UIImageView 圖層樹的變化;

在主線程的下一個 runloop 到來時,Core Animation 提交了這個隱式的 transaction ,這個過程可能會對圖片進(jìn)行 copy 操作。

受圖片是否字節(jié)對齊等因素的影響,這個 copy 操作可能會涉及以下部分或全部步驟:

  1. 分配內(nèi)存緩沖區(qū)用于管理文件 IO 和解壓縮操作。

  2. 將文件數(shù)據(jù)從磁盤讀到內(nèi)存中。

  3. 將壓縮的圖片數(shù)據(jù)解碼成未壓縮的 位圖 形式。

  4. 最后 Core Animation 中 CALayer 使用未壓縮的位圖數(shù)據(jù)渲染 UIImageView 的圖層。

  5. CPU 計算好圖片的Frame,圖片解壓 后就會交給 GPU 來做圖片渲染。

解壓縮

  1. 解壓默認(rèn)是在 主線程 中執(zhí)行的。

  2. 圖片的解壓縮是一個非常耗時的 CPU 操作,所以只有在 確認(rèn)要顯示時,CPU 才會對其進(jìn)行解壓縮。

  3. 解壓過的圖片會緩存起來,不會重復(fù)解壓。

  4. 在子線程提前對圖片進(jìn)行強(qiáng)制解壓縮,而強(qiáng)制解壓縮的原理就是對圖片進(jìn)行重新繪制,得到一張新的解壓縮后的位圖。其中,用到的最核心的函數(shù)是 CGBitmapContextCreate。

CPU / GPU渲染過程中具體分工

CPU: 計算視圖 frame,圖片解碼,需要繪制紋理圖片通過數(shù)據(jù)總線交給 GPU

GPU: 紋理混合,頂點(diǎn)變換與計算,像素點(diǎn)的填充計算,渲染到幀緩沖區(qū)。

時鐘信號: 垂直同步信號V-Sync / 水平同步信號H-Sync。

iOS設(shè)備雙緩沖機(jī)制: 顯示系統(tǒng)通常會引入兩個幀緩沖區(qū),是 CPU 與 GPU 協(xié)作完成的

渲染流程

  1. GPU 獲取獲取圖片的坐標(biāo)

  2. 將坐標(biāo)交給 頂點(diǎn)著色器 (頂點(diǎn)計算)

  3. 將圖片 光柵化 (獲取圖片對應(yīng)屏幕上的像素點(diǎn))

  4. 片元著色器 計算 (計算每個像素點(diǎn)的最終顯示的顏色值)

  5. 從幀緩存區(qū)中渲染到屏幕上

感謝各位的閱讀!關(guān)于“unity3d中圖片渲染流程是什么”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

網(wǎng)頁名稱:unity3d中圖片渲染流程是什么
轉(zhuǎn)載來于:http://bm7419.com/article4/ipogie.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)標(biāo)簽優(yōu)化、商城網(wǎng)站、網(wǎng)站設(shè)計公司、App開發(fā)微信公眾號

廣告

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

搜索引擎優(yōu)化