動畫效果往往都是把時間新增到一些變數的計算中,以便在時間變化時畫面也可以隨之變化。unityshader提供了一系列關於時間的內建變數允許我們方便的在shader中訪問執行時間,實現各種動畫效果。下表給出了這些內建的時間變數。
unity內建的時間變數 名稱
型別描述
_time
float4
t是自該場景載入開始所經過的時間,4個分量的值分別是(t/20,t,2t,3t)。
_sintime
float4
t是時間的正弦值,4個分量的值分別是(t/8,t/4,t/2,t)
_costime
float4
t是時間的余弦值,4個分量的值分別是(t/8,t/4,t/2,t)
unity_deltatime
float4
dt是時間增量,4個分量的值分別是(dt,1/dt,smoothdt,1/smoothdt)
properties
_horizontalamount("horizontal amount",float)=4
_verticalamount("vertical amount",float)=4
_speed("speed",range(1,100))=30
}
subshader
pass
zwrite off
blend srcalpha oneminussrcalpha
}}
由於序列幀影象通常包含了透明通道,因此可以被當成是乙個半透明物件。在這裡我們使用半透明的「標配」來設定它的subshader標籤,即把queue和rendertype設定成transparent,把ignoreprojector設定為true。在pass中,我們使用blend命令來開啟並設定混合模式,同時關閉了深度寫入。
(3)頂點著色器的**非常簡單,我們選擇了進行基本的頂點變換,並把頂點紋理座標儲存到了v2f結構體裡:
v2f vert (a2v v)
(4)片元著色器是我們的重頭戲:
fixed4 frag(v2f i):sv_target
fallback"transparent/vertexlit"
很多2d遊戲都是用了不斷滾動的背景來模擬遊戲角色在場景中的穿梭,這些背景往往包含了多個層(layers)來模擬一種視差效果。而這些背景的實現往往就是利用了紋理動畫。在本節中,我們將實現乙個包含了兩層的無限滾動的2d遊戲背景。學習完本節後,我們可以得到類似下圖的效果。單擊執行後,就可以得到乙個無限滾動的背景效果。
(1)宣告新的屬性:
properties
_detailtex("2nd layer (rgb)",2d)="white"{}
_scrollx("base layer scroll speed",float)=1.0
_scroll2x("2nd layer scroll speed",float)=1.0
_multiplier("layer multiplier",float)=1
}
其中,_maintex和_detailtex分別是第一層(較遠)和第二層(較近)的背景紋理,而_scrollx和_scroll2x對應了各自的水平滾動速度。_multiplier引數則用於控制紋理的整體亮度。
(2)我們的頂點著色器**非常簡單:
v2f vert(a2v v)
我們首先進行了最基本的頂點變換,把頂點從模型空間變換到裁剪空間中。然後。我們計算了兩層背景紋理的紋理座標。為此,我們首先利用transform_tex來得到初始的紋理座標。然後,我們使用內建的_time.y變數在水平方向上對紋理座標進行偏移,以達到滾動的效果。
我們把兩張紋理座標儲存在同乙個變數o.uv中,以減少占用的插值暫存器空間。
(3)片元著色器的工作就相對比較簡單:
fixed4 frag(v2f i):sv_target
我們首先分別利用i.uv.xy和i.uv.zw對兩張背景紋理進行取樣。然後使用第二層紋理的透明通道來混合兩張紋理,這使用了cg的lerp函式。最後我們使用_multiplier引數和輸出顏色進行相乘,以調整背景亮度。
(4)最後,我們把fallback設定為內建的vertexlit(也可以選擇關閉fallback):
fallback "vertexlit"
第十章 函式
使用def關鍵字 定義個數可變的位置形參 定義個數可變的關鍵字形參 定義預設值引數 定義個數可變的位置形參 deffun1 args 結果為乙個元組 print args fun1 10,20,30 10,20,30 定義個數可變的關鍵字形參 deffun2 args 結果為乙個字典 print a...
第十章 屬性
z屬性 本章也比較簡單稍作介紹 無參屬性就是我們常見的屬性 可以封裝屬性 以執行緒安全方式訪問 有參屬性就是c 中的所引器 匿名型別 如圖遇到如下 具體點就是 上面的注釋也已經講清楚了,定義的型別之後,構造例項,然後初始化屬性。現在詳細說下 編譯器接收到 上圖 先用var 定義乙個型別,但是不具體指...
第十章 屬性
目錄 10.1 無參屬性 10.2 有參屬性 10.3 呼叫屬性訪問器方法時的效能 10.4 屬性訪問器的可訪問性 10.5 泛型屬性訪問器方法 物件導向設計和程式設計的重要原則之一就是資料封裝,意味著型別的字段不應該公開,否則很容易因為不恰單使用欄位而破壞物件的狀態。可將屬性想象成智慧型字段,即背...