圖形學中的基本概念

目錄

 

UV

紋素(Texel)

Material Tiling 和 Offset


UV

1.爲什麼需要UV座標?

使用紋理映射(texture mapping)技術,即把2D圖像映射到3D模型三角形表面。

ex:左邊是兩個三角面,右邊是一個貼圖,把一張圖片映射到2個三角形上。 

2.什麼是UV座標? 

在紋理映射過程中,我們使用紋理座標的方式(或稱u、v座標),把紋理進行劃分。UV(紋理映射座標)它定義了圖片上每個點的位置的信息,將圖像上每一個點精確對應到模型表面。無論模型貼圖大小如何,UV紋理一般都被歸一化到[0,1]。

UV座標算法 ex: 模型貼圖1024 * 1024,貼圖某個點的UV座標 = (x/1024,y/1024)  例如(512,512)  UV座標= (0.5,0.5)。

3.爲什麼UV座標要歸一化到[0,1]?

這樣不管紋理大小如何,通過模型頂點的UV座標都能正確找到相對應的紋素。

4.UV座標存在哪?怎麼獲取?

 UV座標存儲在模型頂點中,通過代碼可獲取    Vector2[] tempUv = this.GetComponent<Mesh>().uv;

Unity Shader中 輸入結構體中,通過語義    half2 uv : TEXCOORD0獲得。

5.建3D模型時候,展UV什麼意思?

將建好的模型展開成平面,別人就可以在那平面上繪製貼圖。
例如一個3D正方體模型,展完UV將它分成6個面,然後就可以在這些2D面上繪製貼圖了。

https://blog.csdn.net/hihozoo/article/details/53302586



紋素(Texel)

1.紋素定義

紋理的基本單位。如同屏幕中圖像由多個像素構成,紋理由很多個紋素組成。紋素包含ARGB值。例如8*8的紋理,有64個紋素。

2.紋素獲取

使用紋理,通過UV座標定位,就能取到紋理的紋素。例如一個256x256大小的二維紋理,UV座標(0.5,1.0)對應的紋素座標(128,256)。

3.紋理中的紋素怎麼形成屏幕空間顯示的像素?

使用紋理映射(texture mapping)技術。

  • Magnification 紋理放大

紋理大小爲256*256,但我們的兩個三角形組成的quad卻是512*512,則一個紋理單元(紋素)要對應quad上的四個像素,一個紋理單元對應多個光柵化後的像素的情況通常稱作Magnification。

紋理上一個點對應網格面片的四個點

 在magnification情況下如何進行紋理映射呢?通常是用雙線性插值的方式,比如下面左邊的圖中紅色的pixel,沒有對應的紋理texel,則它的顏色值用它的上下左右的pixel顏色插值得到,當然我們也可以選擇最接近的紋理單元顏色做爲其顏色,

具體要視Filter Mode紋理濾波中設置的MAG值。

  • Minification 紋理縮小

和Magnification相反,三角面小,紋理大。例如128 * 128的面片大小,紋理大小 256 * 256。

這時可以選擇最接近的紋理單元,也可以把上下左右紋理單元進行雙線性插值,再和pixel映射起來。

具體要視Filter Mode紋理濾波中設置的MAG值。

  • Mipmap 多級漸遠紋理技術

選擇創建mipmp層,系統就自動創建一系列採樣的圖像,每個圖像都是前面一個圖像的1/4(如下圖所示)。

 比如紋理原始大小是256*256,我們的三角形是178*178,那麼這時會做三線性插值,四邊形先和128*128紋理執行magnificaiton插值得到一個結果,再和256*256紋理做minification插值得到一個結果,最後再對這2個結果進行線性插值,得到的顏色爲最終的pixel顏色。



Material Tiling 和 Offset

1.含義

Offet:指明使用貼圖的起始位置,取值一般範圍爲0-1。(UV座標偏移量)

Tiling:指明從offset位置處的大小區域,區域的一般取值範圍一般爲(-1,1)。

正常顯示紋理 offset爲(0,0),tilling爲(1,1)。

 

Tiling(2,1)  Offset(0,0)  由於x軸方向爲2。2 * 1 = 2。超過UV座標x最大值1值。此處紋理Wrap Mode = Repeat。

因此效果如下。

Tiling(1,1)  Offset(0,0.5)  由於y軸方向UV偏移了0.5,因此下半部分顯示紋理的上半部分。上半部分由於此處紋理Wrap Mode = Repeat。重複採樣紋理的下半部分填充上半部分。

2.怎麼獲取Tiling,Offset?

2.1 c#代碼獲取:

            //GetComponent<Renderer>().sharedMaterial.mainTextureOffset;
            //GetComponent<Renderer>().sharedMaterial.mainTextureScale;

2.2 Shader中獲取:

申明 紋理名稱+ "_ST" 的變量。變量中包含了材質球中面板中的Offset,Tiling。
例如 紋理 _MainTex  申明  _MainTex_ST變量,變量_MainTex_ST.xy 爲Tiling。_MainTex_ST.zw 爲Offset。 

一般用“UnityCG.cginc” 的宏定義TRANSFORM_TEX計算材質球中的值,以確保採樣得到預期效果。TRANSFORM_TEX等同:

        (tex,name) (tex.xy * name##_ST.xy + name##_ST.zw)  

計算真正的UV,用於後邊的紋理採樣: o.uv = TRANSFORM_TEX (v.texcoord, _MainTex); 

  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章