天天看點

大白話版 UnityShader學習(1)-基礎紋理研究(一)大白話版 UnityShader學習(1)-基礎紋理研究(一)

大白話版 UnityShader學習(1)-基礎紋理研究(一)

根據馮樂樂大小姐的書來進行學習,總結學習經驗,分享心得。

基礎紋理

針對于紋理,說白了就是,“啪”的一聲,你的媽媽在做飯的時候突然知道你考了0分,随手抄起身邊的擀好的面皮就胡到了你的臉上,面皮會很深刻的印刻出你的樣貌,那麼你增加了一個有面皮紋理的外形,我們稱為這個技術叫紋理映射(texture mapping)技術,馮姐姐讓我們了解的更透徹,于是“發明”了一個詞**“逐紋理”**,以此來控制模型的顔色。

那麼問題來了,既然shader就是一種玩坐标法線切線的神奇代碼,那麼會有涉及這些嘛。。。。of course,當然有啦,這邊便有了紋理映射坐标**(texture-mapping coordinates),而紋理的屬性為2D,通常紋理映射坐标也被稱為UV坐标**,u為橫向坐标,v為縱向坐标(ps:我這邊的了解是scale裡的x,y,用作橫向和縱向的拉伸)

上面是介紹,下面便是硬貨了,這邊有個東西很重要,我們知道,紋理的貼圖它總是不固定,256x256、64x64、32x32等等,各種類型的紋理,但是為什麼在圖檔上顯示的時候看起來都是ok的?對了,這邊也用到了歸一化,如果說你學習了光照就知道,老外的腦子真的是可以的,他們思考如果我們沒有一個統一參數,我們就統一參數好了, 把一個很大很大的子產品或者貼圖,切割成一個等比例1:1的貼圖,那麼無論它怎麼一個變化,其實也就是把這個1:1的貼圖複制複制在複制而已。是以通常頂點UV坐标的範圍都是被歸一化到【0,1】之間。

那麼這邊思考完又會有個想法, 那麼計算機是如何處理超出【0,1】的圖像呢,畢竟如果是單純的複制絕對不行,很多圖檔也不是光複制就能讓樣式變得好看的。看下方的圖檔:

大白話版 UnityShader學習(1)-基礎紋理研究(一)大白話版 UnityShader學習(1)-基礎紋理研究(一)

這個是一個牆面的貼圖,在OpenGL和DirectX這倆個大佬打仗的變态戰争中,産生了倆種不同的坐标系,這個很重要,馮姐姐在書中多次強調這個的重要性。OpenGL中,紋理空間的坐标在左下角,而DirectX中,紋理空間的坐标在左上角。是以說OpenGL讓人用的很爽!!!(個人觀點)但是我還是想用N卡,真香~ 不過!Unity畢竟還是一個拯救戰場的救世主嘛,在大部分的情況下,已經為我們處理好了這個問題,當然作為開發人員,我們從來就不是很關注大部分的情況,少部分的情況尤其關鍵,否則會被策劃煩的頭昏腦漲,這邊舉個例子:

如果我們開啟了抗鋸齒(在Edit->Project Settings->Quality->Anti Aliasing中開啟)并在此時使用了渲染到紋理的技術,那麼恭喜你,你發現了連救世主沒解決的東西。首先,梳理一下,Unity一般在這種情況下,處理的時候肯定是先輸出圖像,然後再進行抗鋸齒處理,得出的抗鋸齒紋理來進行後續的處理(采樣坐标是需要符合DirectX平台規定的),如果說隻是渲染一個圖檔,那你完全不用擔心這個問題;但如果同時渲染多張紋理的時候,那麼問題就出來的,那麼這裡的解決方法就是自己處理0.0(凡事還是得靠自己啊),解決方法如下:

#if UNITY_UV_STARTS_AT_TOP
if(_MainTex_TexelSize.y) < 0)
       uv.y = 1 - uv.y;
 #endif
           

UNITY_UV_STARTS_AT_TOP這個代碼是專門用于判斷目前平台是否是DirectX類型的平台,然後來進行處理。

繼續閱讀