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