《Unity着色器和屏幕特效开发秘笈(原书第2版)》一2.9 打包和混合纹理
生活随笔
收集整理的這篇文章主要介紹了
《Unity着色器和屏幕特效开发秘笈(原书第2版)》一2.9 打包和混合纹理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本節書摘來自華章出版社《Unity著色器和屏幕特效開發秘笈(原書第2版)》一書中的第2章,第2.9節,作者 [英]艾倫朱科尼(Alan Zucconi) [美]肯尼斯拉默斯(Kenneth Lammers),更多章節內容可以訪問云棲社區“華章計算機”公眾號查看
2.9 打包和混合紋理
紋理不僅在存儲許多像素顏色數據的時候非常有用,同時還可以用來存儲x和y方向的一堆像素集合以及其RGBA通道。可以將幾個圖像打包成一個RGBA紋理,然后通過著色器代碼來提取每一個R,G,B,A組件作為單獨的紋理。
將幾個獨立的灰度圖像打包成一個RGBA紋理的例子如下圖所示:
為什么要打包呢?在你的游戲中,紋理要占據一大部分的存儲空間。但是如果能將多個紋理打包成一個,就可以相當程度地減少這一部分的存儲空間。
任何一個灰度紋理都可以打包成另外一個彩色紋理的RGBA通道中的一個。這個說法可能剛開始聽起來有點難懂,但是在這一節中我們會創建一個使用打包過的紋理的例子。
另外一個可能需要用到打包紋理的場景是,你想把數種紋理混合之后涂在一個表面上。這種需求通常出現在地形類的著色器上,此時你往往需要很好地將數種紋理混合到一起。這一節中用到的四紋理混合地形著色器可能會對你有所幫助。
2.9.1 準備工作
首先在Shaders文件夾中創建一個新的著色器文件,然后為該著色器創建一種新的材質。命名規范完全取決于你自己,所以可以自己想個好用的名字。
準備好著色器和材質之后,再創建一個場景用來測試著色器。
你可能還需要準備好想混合到一起的四種紋理。可以隨便找出四種紋理,但是要想讓地形看起來酷炫的話,可以按照草皮、泥土、碎石和石塊準備四種紋理。
本節例子中用到的紋理可以在本書附帶的資源文件中找到。
最后還需要一個用來打包這些灰度圖像的混合紋理。這個混合紋理中混合了四種基礎紋理,通過這個混合紋理我們可以清楚地看到它呈現在物體表面的樣子。
可以使用一些非常復雜的混合紋理來創建一些非常擬實的地形來,如下圖所示:
2.9.2 操作步驟
按照下面的步驟來理解如何通過輸入代碼來使用打包的紋理:
4. 在surf()函數中,得到紋理信息,然后將其存儲在對應的變量中,以便后續使用:
5. 使用lerp()函數來將紋理混合。該函數接受三個參數,即lerp(value : a, value : b, blend: c)。lerp函數會將兩種紋理按照最后一個浮點數參數指定的比例進行混合:
6. 最后,將混合紋理乘以顏色嵌入值,然后使用紅色通道來判斷兩個不同的地形嵌入顏色應該在哪里:
嵌入四種紋理之后創建出來的地形如下圖所示:
2.9.3 工作原理
這里看起來又有了幾行新代碼,但是混合紋理背后的原理其實非常簡單。為了混合紋理,需要使用CgFX標準庫中內建的lerp()函數。通過這個函數可以將第一個參數和第二個參數按照第三個參數指定的比例進行混合:
函 數 描 述
lerp(a,b,f) 該函數使用如下方式線性插值:
( 1 – f ) a + b f
這里的a和b是向量或者標量。f參數可以是一個與a和b相同類型的標量或者向量
所以,如果想要找到1和2之間的中間值,可以使用lerp()函數,并且將第三個參數指定為0.5,這樣lerp()函數就會返回其中間值1.5。這個函數非常適用于混合紋理的場景,因為每一個RGBA通道的紋理都是浮點型的數值,范圍是0到1。
在著色器中,我們從混合紋理中取一個通道,然后用該通道來存放lerp()函數的輸出值。例如我們取了草皮紋理和泥土紋理,使用了混合紋理中的紅色通道,將其填充到lerp()函數。通過這種方式表面的每一個像素就會得到正確的混合顏色。
下圖展示了一個更加可視化的使用lerp ()函數混合的例子:
著色器代碼只是使用了混合紋理的四個色值通道以及所有的顏色紋理來創建最終的混合紋理。最后的紋理可以作為我們乘以漫反射光照的基礎顏色。
總結
以上是生活随笔為你收集整理的《Unity着色器和屏幕特效开发秘笈(原书第2版)》一2.9 打包和混合纹理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux性能优化2.1 CPU性能统计
- 下一篇: 《超越需求:敏捷思维模式下的分析》—第1