圖文詳解Unity3D中Material的Tiling和Offset是怎么回事
Tiling和Offset概述
Tiling表示UV坐標的縮放倍數,Offset表示UV坐標的起始位置。
這樣說當然是隔靴搔癢。
下面用*.3ds文件作為模型,介紹Tiling和Offset到底是怎么回事。
3DS格式解析
比如我有這樣一個tank_player.3ds模型。右側的'select'處的圖片就是貼圖。
*.3ds文件最基本的內容包括頂點列表Vertices、貼圖坐標列表UVs、面列表Faces。其中Vertices和UVs的數目相等。下面就是用文本描述的tank_player.3ds文件的內容,這是一個樹結構,用先序遍歷即可將其改寫為二進制的3ds文件。這個XML結構就是從二進制的tank_player.3ds分析來的。
1 <_MainChunk Length="8386"> 2 <_CVersion Length="10">3</_CVersion> 3 <__3DEditorChunk Length="8370"> 4 <_ObjectBlock Length="8364"> 5 <String Length="16">Tank_PlayerMesh</String> 6 <_TriangularMesh Length="8342"> 7 <_VerticesList Length="3776"> 8 <numVerts Length="2">314</numVerts> 9 <Vector X="0.7707" Y="52.527" Z="104.4209" Length="12" /> 10 <Vector X="6.2672" Y="58.6059" Z="104.4909" Length="12" /> 11 … 12 <Vector X="-0.4168" Y="65.2885" Z="104.4949" Length="12" /> 13 </_VerticesList> 14 <_MappingCoordinatesList Length="2520"> 15 <TexCoordCount Length="2">314</TexCoordCount> 16 <TexCoord u="0.7052" v="0.9314" Length="8" /> 17 <TexCoord u="0.7434" v="0.9053" Length="8" /> 18 … 19 <TexCoord u="0.7701" v="0.9442" Length="8" /> 20 </_MappingCoordinatesList> 21 <_FacesDescription Length="2040"> 22 <numIndices Length="2">254</numIndices> 23 <triIndex v1="0" v2="1" v3="2" Length="8" /> 24 <triIndex v1="0" v2="2" v3="3" Length="8" /> 25 … 26 <triIndex v1="4" v2="5" v3="6" Length="8" /> 27 </_FacesDescription> 28 </_TriangularMesh> 29 </_ObjectBlock> 30 </__3DEditorChunk> 31 </_MainChunk>
這里面的_VerticesList 是頂點坐標列表,每個Vector都是3D模型中的一個頂點;_MappingCoordinatesList是貼圖坐標列表UVs,每個TexCoord都是在貼圖上的一個坐標點。FacesDescription則是面列表,由于Vertices和UVs的數目相等,每個triIndex都用索引指定了3個vertex和3個UV。3個vertex就在3D世界畫了一個三角形,這些三角形就組成了上圖所示的坦克模型。3個UV則在貼圖上畫了一個三角形。貼圖是這樣的:
而UVs在貼圖上畫出的三角形則如下圖所示。
可以看到是完全對應的。一個triIndex指定了3D模型的一個三角形平面A,也指定了貼圖上的一個三角形平面B,把B貼到A上,就是我們看到的3D模型了。
這么半天都在講解3DS文件格式,是為了方便下面開始說明Tiling和Offset的用法。
Offset是什么意思
為了簡單,我們看下面這個模型。它就是4個三角形拼接成的一個正方形。
此模型的UVs畫出來是這樣的:
此模型的貼圖如下。
Offset這個概念就從這個貼圖上開始說。
如下圖所示,貼圖左下角為原點(0, 0),右上角為(1, 1),畫直角坐標系,橫軸為X方向的Offset,縱軸為Y方向的Offset。
Offset的作用,就是決定UVs在貼圖上的起始位置。
下圖所示,是Offset在X和Y軸都為0時的樣子。UVs坐標框住了貼圖下半塊左邊的那一部分,那么這部分貼圖就會被貼在模型上。
所以你會看到這樣的結果。
現在我把Y軸的Offset設置為0.5。意思是UVs的左下角變成了(0, 0.5)。
那么UVs在貼圖上的貼合情形就如下圖所示了,此時UVs框住了貼圖上半邊左側的那塊(紅色的半圓)。
可以想象現在的模型是什么樣子了吧?
Tiling是什么意思
說完Offset,Tiling就好理解了。Offset控制了UVs的起始位置,Tiling則控制了UVs的縮放比例。默認(1, 1)的縮放比例就是原始比例。現在我把Y軸的Tiling改為2。
那么UVs與貼圖的貼合情況就成了這樣:
貼圖還是那個貼圖,UVs的縱坐標則都乘以2了。所以最后的模型就會是這樣:
總結
Tiling表示UV坐標的縮放倍數,Offset表示UV坐標的起始位置。
綜合利用Offset和Tiling,就可以做一點有趣的事了。
本文的模型是從坦克艦隊里分析轉化得到的。我將在另一篇文章里說明轉化方法。
文章列表