關(guān)系1:
Material 引用 shader ,shader 引用 Texture.
材質(zhì)引用著色器,著色器引用紋理.
關(guān)系 2:
紋理包含 2D 圖片,包含法線貼圖
2D 圖片只有像素點, RGB 值只表示像素.沒有空間感
法線貼圖中的 RGB 點表示方向矢量的 X疗锐、Y 和 Z 值,有空間感,通常具有藍色色調(diào)祸挪,并且不包含任何實際的淺色或深色著色
紋理具有凹凸感,像素值,這些東西都可以存儲在一張圖片上面.
2D圖像的導(dǎo)入以及設(shè)置
- Unity支持的圖像文件格式包括TIFF、PSD友绝、TGA抛腕、JPG芋绸、PNG、GIF担敌、BMP摔敛、IFF、 PICT等全封。
- Unity支持含多個圖層的PSD格式的圖片马昙。PSD格式圖片中的圖層在導(dǎo)入Unity之后將會自動合并顯示桃犬,但該操作并不會破壞PSD;原文件的結(jié)構(gòu)。
- 圖片紋理的尺寸是2的n次幕行楞,例如32攒暇、64、128子房、256形用、102硅爭,以此類推(最小像素大千等千32,最大像素小于等于8192) , 圖片的長证杭、寬則不需要—致田度。例如512X 1 024、256X 64等都是合理的.
- 出于性能上的考慮解愤, 模型的貼圖要盡量使用Mip Maps镇饺。 該方式雖然會多消耗33%的內(nèi)存, 但在渲染性能和效果上有很大的優(yōu)勢送讲。 可 以使距相機較遠的游戲?qū)ο笫褂幂^小的紋理奸笤。
最后在非地面和地板模型對象上,盡量不要使用Anisotropic filtering哼鬓。 - 在圖片的Inspector檢視面板中,設(shè)置Format格式揭保。 該項用來設(shè)置圖片的壓縮格式, 有3種格式可供選擇(如果 Texture Type設(shè)置為Advanced, 則會有34種格式.其中 3 種為:? Compressed : 壓縮紋理魄宏, 該項為默認選項, 是最常用的紋理格式存筏。 壓縮的格式會根據(jù)發(fā)布的平臺自動選擇宠互。? 16 bit: RGB彩色 , 16位彩色圖最多可以有216種顏色椭坚。 (佃貢量的真彩色)16 bit格式為非壓縮格式予跌, 會占用較大磁盤空間。? Truecolor: 真彩色善茎, 是晟離質(zhì)量的真彩色 券册, 也就是32位色彩(256 X 256的紋理大小為256 KB)。 Truecolor格式為非壓縮格式垂涯, 會占用較大磁盤空間烁焙。
- Non Power of 2: 圖片尺寸非2的n次幕。該項在導(dǎo)入并選擇了非2的次幕尺寸圖像的清況下才可用耕赘。該項的主要作用是將圖像尺寸縮放到2的次露骄蝇,有4種方式可供選擇。? None: 無操骡。對圖像尺寸不進行處理九火。? ToNearest: 到最接近的(尺寸)赚窃。將圖像尺寸縮放到最接近2的次幕大小。例如513X 1 023像素的圖像將被縮放成512X 1 024像素岔激。? Tolarger : 到較大的(尺寸)勒极。將圖像尺寸放大到較大的最接近2的次幕大小。例如257X 513像素的圖像將被放大成512X 1 024像素虑鼎。? ToSmaller: 到較小的(尺寸)辱匿。將圖像尺寸縮小到較小的最接近2的次幕 大小。例如254X 511像素的圖像將被縮小成256X 256像素震叙。
- Convolution Type: 反色貼圖旋轉(zhuǎn)類型掀鹅。? None: 無反色類型。? Specular: 鏡面反射媒楼。? Diffuse (lrradiance) : 漫反射乐尊。
- Fixup Edge Seams: 固定邊緣接縫處。當反射貼圖有接縫時可嘗試選中該選項進行控制划址。
Read/Write Enabled: 讀/寫啟用扔嵌。選中該項將允許從腳本(GetPixels、SetPixels—
和其他Texture2D函數(shù))訪問紋理數(shù)據(jù)夺颤。同時會產(chǎn)生個紋理副本痢缎,會消耗雙倍的內(nèi)存,建議謹?shù)崾褂谩?/li> - ? Import Type: 導(dǎo)入類型世澜。該項用來指定導(dǎo)入圖像的類型独旷,可理解為用千指定 圖像在導(dǎo)入前計劃的應(yīng)用類型。例如圖像在三維軟件烘焙出來的法線貼圖寥裂、光照貼圖等嵌洼,在導(dǎo)入之前就知道這類圖片的用途,導(dǎo)入后需要根據(jù)圖像的用途指定相應(yīng)的類型封恰。有3種類型可供選擇麻养。
? Default: 初始默認的。指定此類型就代表將圖像作為普通紋理被導(dǎo)入诺舔、使用鳖昌。選擇該項時,有如下5個子項低飒。
Alpha from Grayscale: 依據(jù)灰度產(chǎn)生Alpha誦道许昨。選中該項,將依據(jù)圖像 —
自身的灰度值產(chǎn)生個Alpha透明度通道褥赊。
Alpha is Transparency: 依據(jù)Alpha通道產(chǎn)生透明度车要。
Bypass sRGB Sampling: 通過sRGB采樣。使用精確顏色值而非補償值來對其進行校正崭倘,當紋理被用作GUI或被編譯成非圖像信息時才選中該項翼岁,且此選項只在紋理導(dǎo)入類型為Default時可用类垫。
Encode as RGBM: 編碼方式為RGBM,下拉菜單里可兇鉗圣自動、開琅坡、關(guān)悉患、編碼。 —
Sprite Mode: Sprite模型榆俺。有None(無)售躁、Single(單的)、Multiple(多重的)可選茴晋。
? Normal Map: 法線貼圖陪捷。指定此類型就代表將圖像作為法線貼圖導(dǎo)入、使用诺擅。? Lightmap: 光照貼圖市袖。 指定此類型就代表將圖像作為光照貼圖導(dǎo)入、 使用. - Generate Mip Maps: 生成MipMaps烁涌。選中該項將生成仙pmap苍碟。例如當紋理 在屏幕上非聿小時,Mipmaps會自動調(diào)用該紋理較小的分級撮执。包括如下幾個 選項微峰。
? In Linear Space: 選擇該項代表依據(jù)線性顏色空間產(chǎn)生Mipmaps。
? Border Mip Maps: 選擇該項代表避免色彩滲出邊緣抒钱。一般應(yīng)用于燈光游戲?qū)ο蟮?cookie.? Mip Map Filtering: Mip Map過濾方式蜓肆, 有兩種方式可供選擇。
Box: 采取最基本的方法處理Mipmaps級別谋币, 隨著紋理尺寸的減小仗扬,將仙p級別做平滑處理。
Kaiser: 此種是隨著紋理的減小對Mipmaps進行銳化的篇法瑞信。 該方法可以改善紋理在攝像機與紋理的距離過遠時出現(xiàn)的紋理模糊問題。
? Fadeout Mip Maps: 淡出Mip映射貼圖穴豫。 選中該項將使Mipmaps隨著Mip的級別而褪色為灰色凡简, 該方式適用于DetailMaps (細節(jié)貼圖)。 滑塊在最左—側(cè)代表開始淡出的第 個Mip級別精肃, 最右側(cè)代表Mip級別完全變灰秤涩。
圖片資源類型的設(shè)置
- Texture Type: 紋理類型。 此處可選擇Defalut(紋理)司抱、Normal map (法線貼圖)筐眷、Editor GUI and Legacy GUI (圖形用戶界面)、Sprite(2D and UI)习柠、Cursor(光標文件)匀谣、Single Channel(單通道)照棋、Cookie(作用于光原的Cookie)、Lightmap (光照貼圖)等8種類型武翎。
- Alpha Is Transparency: 依據(jù)透明度產(chǎn)生Alpha通道烈炭。 選中該項,將依據(jù)圖像自身的透明度值產(chǎn)生一個Alpha透明度誦道宝恶。
- Alpha Source from Gray Scale: 依據(jù)灰度產(chǎn)生Alpha誦道符隙。 選中該項,將依據(jù)圖像自身
的灰度值產(chǎn)生一個Alpha透明度誦道垫毙。 - Wrap Mode:循環(huán)模式霹疫。控制紋理平鋪時的樣式综芥,有兩種方式可供選擇丽蝎。? Repeat: 重復(fù)。該項為默認選項毫痕,選擇該項后紋理將以雷復(fù)平鋪的方式映射在游戲?qū)ο笊稀? Clamp: 夾鉗/截斷征峦。 選擇該項后將以拉伸紋理的邊緣的方式映射在游戲?qū)ο笊稀?/li>
- Filter Mode: 過濾模式∠耄控制紋理通過三維變換拉伸時的計算(過濾)方式栏笆,有3種方式可供選擇。
1)Point: 點模式臊泰。是 一種較簡單材質(zhì)圖像插值的處理方式蛉加, 會使用包含像素最多部分的圖素來貼圖.簡單說就是圖素占到最多的像素就用此圖素來貼圖,這種處理方式比較快,材質(zhì)的品質(zhì)較差,有可能出現(xiàn)馬賽克現(xiàn)象.2)Bilinear:雙線性.這是一種較好的材質(zhì)圖像插值的處理方式,會先找出最接近像素的四個圖素,然后在他們之間做插值計算,最后產(chǎn)生的結(jié)果才會被貼到像素位置上,這樣不會看到"馬賽克"現(xiàn)象.這種處理方式教適用于有一定景深的靜態(tài)影像,不過無法提供最佳品質(zhì),也不適用于移動的游戲?qū)ο?3)Trilinear: 三線性。這是—種更復(fù)雜材質(zhì)圖像插值處理方式缸逃,會用到相當多的材質(zhì)貼圖针饥,而每張的大小恰好會是另—張的四分之—。例如有—張材質(zhì)影像是512X 512個像素需频,第二張就會是256X 256個像素丁眼,以此類推。憑借這些多重解析度的材質(zhì)影像昭殉,當遇到景深較大的場景時贷盲,可以提供最高的貼圖品質(zhì)厕诡,會去除材質(zhì)的“閃爍"效果。對于需要動態(tài)物體或景深很大的場景應(yīng)用方面而言,選用此種方式會獲得最佳的效果宁脊。 - Aniso Level: 各向異性級別旭从。當以一個過小的角度觀察紋理時施戴,此數(shù)值越高觀察到的紋理質(zhì)量就越高壁榕,該參數(shù)對于提高地面等紋理的顯示效果非常明顯。
法線貼圖
- Texture Type選擇Normal map: 法線貼圖類型。選擇此類型撵渡,可將圖像顏色通道變成—個適合于法線映射的格式.
- Create from Grayscale: 依據(jù)灰度產(chǎn)生Alpha誦道融柬。選中該項,依據(jù)圖像自身的灰度值計算法線貼圖的凹凸值,選中姥闭。
- Bumpiness: 凹凸強度調(diào)節(jié)丹鸿,該項用來控制貼圖凹凸的量。
- Filtering : 過濾棚品】炕叮控制法線貼圖的凹凸的計笢方式,有兩種方式可供選擇:? Sharp: 銳化铜跑,這種方式產(chǎn)生的法線貼圖更加清晰门怪、銳利。? Smooth: 平滑锅纺,這種方式產(chǎn)生的法線貼圖比較平滑掷空。
圖形用戶界面類型
- Editor GUI and Legacy GUI: 圖形用戶界面類型。選擇此類型囤锉,紋理適用 于HUD/GUI所用的紋理格式坦弟,參數(shù)如璽8-29所示。需要注意的是官地,如果紋理的大小非2的N次幕酿傍,且紋理的類型被設(shè)置為GUI,Unity會將該紋理強制轉(zhuǎn)換為Truecolor(真彩)格式。
Sprite (2D and UI)
- Sprite Mode: Sprite模式,有兩種模式可選擇,? Single: 單獨的驱入。? Multiple: 多個的赤炒。
- Packing Tag: 標簽。 在輸入框中可以輸入標簽名稱亏较。打圖集時使用.
- Pixels To Units: 像素單位莺褒。 輸入生成的網(wǎng)格尺寸。
- Pivot: 對齊方式雪情。? Center: 中心對齊遵岩。? Top Left: 左上對齊。? Top: 上對齊巡通。? Top Right: 右上對齊尘执。? Left: 左對齊。? Right: 右對齊扁达。? Bottom Left: 左下對齊正卧。? Bottom: 下對齊蠢熄。? Bottom Right: 右下對齊跪解。? Custom: 自定義。
- Generate Mip Maps: 生成仙mip貼圖。選中該選項叉讥,可以打開Mip貼圖窘行。其他參數(shù)參考Texture類型
Cursor
- Cursor: 光標文件。選擇此類型图仓,紋理適用于光標所用的紋理格式.
Cubemap
- Cubemap: 立方體貼圖罐盔。選擇此類型,此類型紋理適用千反射所用的紋理格式
- Mapping: 映射救崔。 該項決定映射到立方體貼圖上的反射貼圖方式惶看。 有4種方 式可供選擇。? Auto: 自動六孵。是默認設(shè)置纬黎。? 6 Frames Layout (Cubic Environment) : 6框架布局。 可以理解為將圖片包含的6個圖像分別映射到—個立方體的6個面上劫窒。? Latitude-Longitude Layout (Cylindrical) : 圓柱方式本今。 紋理以圓柱的方式 映射到反射貼圖上。? Mirrored Ball (Spheremap) : 球形包裹方式主巍。 圖像以包裹球形的方式映 射到反射貼圖上冠息。
- Glossy Reflection: 光澤反射。
- Fixup Edge Seams: 固定邊緣接縫處孕索。 當反射貼圖有接縫時可嘗試選中該項進行控制逛艰。
Cookie
- Cookie: 作用千光涼的Cookie, 選擇此類型, 紋理適用于燈光游戲?qū)ο蟮腃ookie, 參數(shù)如圖8-33所示檬果。
- Light Type: 光源類型瓮孙。 該項用來指定該紋理計劃作用千光源的類型, 有3種 光涌可供選擇选脊。?Spotlight: 聚光燈杭抠。 如選擇此類型光源, 建議紋理的邊緣保證為純雖色恳啥, 這樣會獲得正確的結(jié)果偏灿。? Directional: 平行光源。如選擇此類型光钝的;原翁垂,實現(xiàn)整個場景的照明。? Point: 點光源硝桩。 如選擇此類型光源沿猜, 會多出Mapping 、Fixup edge seams兩項碗脊, Mapping參考Cubemap類型的相關(guān)講解啼肩。 選中Fixup edge seams項 可對固定邊緣處接縫進行控制。
- Alpha from Grayscal: 選中該項,可通過灰度計笢通道祈坠。 其他參數(shù)參考Texture類型害碾。
圖片渲染過程(iOS)
轉(zhuǎn)載聲明
作者:vony
相關(guān)名詞
GPU(Graphic Processor Unit)
圖形處理單元
GLSL(OpenGL Shading Language)著色語言
是用來在OpenGL中著色編程的語言,也即開發(fā)人員寫的短小的自定義程序赦拘,他們是在顯卡的 GPU 上執(zhí)行的慌随,代替了固定的渲染管線的一部分,使渲染管線中不同層次具有可編程性躺同。比如:視圖轉(zhuǎn)換阁猜、投影轉(zhuǎn)換等。GLSL 的著色器代碼分成2個部分:Vertex Shader(頂點著色器)和Fragment(片元著色器)
頂點著色器(VertexShader)
一般用來處理圖形每個頂點變換(旋轉(zhuǎn)/平移/投影等)
頂點著色器是OpenGL中用于 計算頂點屬性 的 程序 蹋艺。頂點著色器是逐頂點運算的程序蹦漠,也就是說 每個頂點數(shù)據(jù)都會執(zhí)行一次頂點著色器,當然這是 并行 的车海,并且頂點著色器運算過程中無法訪問其他頂點的數(shù)據(jù)笛园。
一般來說典型的需要計算的頂點屬性主要包括頂點坐標變換、逐頂點光照運算等等侍芝。頂點坐標由自身坐標系轉(zhuǎn)換到歸一化坐標系的運算研铆,就是在這里發(fā)生的。
片元著色器程序(FragmentShader)
一般用來處理圖形中每個像素點顏色計算和填充
片段著色器是OpenGL中用于計算片段(像素)顏色的程序州叠。片段著色器是逐像素運算的程序棵红,也就是說 每個像素都會執(zhí)行一次片段著色器 ,也是 并行 的咧栗。
頂點 & 頂點數(shù)據(jù)
頂點指的是我們在繪制一個圖形時它的頂點位置數(shù)據(jù)逆甜。這個數(shù)據(jù)可以直接存儲在數(shù)組中或者將其緩存到GPU內(nèi)存中。
畫圖一般是先畫好圖像的骨架致板,然后再往骨架里面填充顏色交煞。頂點數(shù)據(jù)就是圖像的骨架,OpenGL中的圖像都是由圖元組成斟或。在OpenGLES中素征,有3種類型的圖元:點、線萝挤、三角形御毅。
頂點數(shù)組(VertexArray) & 頂點緩沖區(qū)(VertexBuffer)
開發(fā)者可以選擇設(shè)定函數(shù)指針,在調(diào)用繪制方法的時候怜珍,直接由內(nèi)存?zhèn)魅腠旤c數(shù)據(jù)端蛆,也就是說這部分數(shù)據(jù)之前是存儲在 內(nèi)存 當中的,被稱為 頂點數(shù)組 酥泛。而性能更高的做法是今豆,提前分配一塊 顯存 侈沪,將頂點數(shù)據(jù)預(yù)先傳入到顯存當中。這部分的顯存晚凿,就被稱為 頂點緩沖區(qū) 。
光柵化(Rasterization)
是把 頂點數(shù)據(jù)轉(zhuǎn)換為片元的過程 瘦馍,將圖轉(zhuǎn)化為一個個柵格組成的圖象歼秽。把物體的數(shù)學(xué)描述以及與物體相關(guān)的顏色信息轉(zhuǎn)換為屏幕上用于對應(yīng)位置的像素及用于填充像素的顏色。
光柵化包含了兩部分的工作情组。第一:決定窗口坐標中的哪些整型柵格區(qū)域被基本圖元占用燥筷;第二:分配一個顏色值和一個深度值到各個區(qū)域。
紋理
可以理解為圖片院崇。
圖片加載的工作流程(iOS)
UIImage *image = [UIImage imageWithContentsOfFile:@"filePath"];
從磁盤中加載一張圖片肆氓,這個時候的圖片并沒有解壓縮;
imageView.image = image;
然后將生成的 UIImage 賦值給 UIImageView 底瓣,這一步確認顯示圖片谢揪,CPU 才開始解碼;
接著一個隱式的 CATransaction 捕獲到了 UIImageView 圖層樹的變化捐凭;
在主線程的下一個 runloop 到來時拨扶,Core Animation 提交了這個隱式的 transaction ,這個過程可能會對圖片進行 copy 操作茁肠。
受圖片是否字節(jié)對齊等因素的影響患民,這個 copy 操作可能會涉及以下部分或全部步驟:
- 分配內(nèi)存緩沖區(qū)用于管理文件 IO 和解壓縮操作。
- 將文件數(shù)據(jù)從磁盤讀到內(nèi)存中垦梆。
- 將壓縮的圖片數(shù)據(jù)解碼成未壓縮的 位圖 形式匹颤。
- 最后 Core Animation 中 CALayer 使用未壓縮的位圖數(shù)據(jù)渲染 UIImageView 的圖層。
- CPU 計算好圖片的Frame托猩,圖片解壓 后就會交給 GPU 來做圖片渲染印蓖。
解壓縮
- 解壓默認是在 主線程(CPU) 中執(zhí)行的。
- 圖片的解壓縮是一個非常耗時的 CPU 操作京腥,所以只有在 確認要顯示時另伍,CPU 才會對其進行解壓縮。
- 解壓過的圖片會緩存起來绞旅,不會重復(fù)解壓摆尝。
- 在子線程提前對圖片進行強制解壓縮,而強制解壓縮的原理就是對圖片進行重新繪制因悲,得到一張新的解壓縮后的位圖堕汞。其中,用到的最核心的函數(shù)是 CGBitmapContextCreate晃琳。
CPU / GPU渲染過程中具體分工
- CPU: 計算視圖 frame讯检,圖片解碼琐鲁,需要繪制紋理圖片通過數(shù)據(jù)總線交給 GPU
- GPU: 紋理混合,頂點變換與計算人灼,像素點的填充計算围段,渲染到幀緩沖區(qū)。
- 時鐘信號: 垂直同步信號V-Sync / 水平同步信號H-Sync投放。
- iOS設(shè)備雙緩沖機制: 顯示系統(tǒng)通常會引入兩個幀緩沖區(qū)奈泪,是 CPU 與 GPU 協(xié)作完成的
渲染流程
- GPU 獲取獲取圖片的坐標
- 將坐標交給 頂點著色器 (頂點計算)
- 將圖片 光柵化 (獲取圖片對應(yīng)屏幕上的像素點)
- 片元著色器 計算 (計算每個像素點的最終顯示的顏色值)
- 從幀緩存區(qū)中渲染到屏幕上
總結(jié)
- 讀取文件
- 計算Frame
- 圖片解碼
- 解碼后紋理圖片位圖數(shù)據(jù)通過數(shù)據(jù)總線交給GPU ->
- GPU獲取圖片F(xiàn)rame ->
- 頂點變換計算 ->
- 光柵化 ->
- 根據(jù)紋理坐標獲取每個像素點的顏色值
- 渲染到幀緩存區(qū)
- 渲染到屏幕