1.逐帧动画shader
生活随笔
收集整理的這篇文章主要介紹了
1.逐帧动画shader
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最近項目壓力不大,抽時間看了些關于shader和游戲引擎的書籍,準備開始shader的學習。
在網上看到這位前輩(http://blog.sina.com.cn/s/articlelist_2312702844_6_1.html)寫的博客,覺得很不錯,學習曲線應該很適合自己,所以決定也從頭一篇一篇每個shader自己實現一下,并加入自己的理解。今天就是調試的第一篇,很簡單的逐幀動畫shader。
這個shader的原理就是根據時間,變化uv的值,使得紋理映射時取的uv范圍本應是0到1,變化為根據子圖片數量切割成的區間。比如序列幀圖片為兩行四列,在紋理映射時,x和y的范圍本應是0到1,但是經過處理,會變成在不同的時間段內,映射范圍為不同的區間,比如x軸分別為0-0.25,0.25-0.50,0.50-0.75,0.75-1;y軸為0-0.5,0.5-1.這樣,在不同的時間段內就可以取出對應的子圖片。
Shader "Stutdy/1_FrameAnimation" {Properties{_Color("Main Color", Color) = (1,1,1,1)_MainTex("Base (RGB) Trans (A)", 2D) = "white" {}_SizeX("列", Float) = 4_SizeY("行", Float) = 2_Speed("播放速度", Float) = 150}SubShader{// 這里使用Unity3d自帶光照模型Lambert// 不用做頂點處理,只需要一個表面處理函數surfCGPROGRAM#pragma surface surf Lambert alpha //開啟Alpha透明// 聲明參數fixed4 _Color;sampler2D _MainTex;uniform fixed _SizeX;uniform fixed _SizeY;uniform fixed _Speed;// 獲取_MainTex的UV信息定義輸入結構體struct Input{// 在貼圖變量前加上uv表示提取uv值(二維坐標)float2 uv_MainTex;};void surf(Input IN, inout SurfaceOutput o){// 獲取單元格UVfloat2 cellUV = float2(IN.uv_MainTex.x / _SizeX, IN.uv_MainTex.y / _SizeY); //這步首先把范圍縮小為初始為0的區間// UV坐標值范圍為0-1,獲取單元格寬度float deltaX = 1 / _SizeX; // 每個區間寬度float deltaY = 1 / _SizeY; // 每個區間高度// 當前播放總索引int index = _Time * _Speed;// 求列索引int col = fmod(index, _SizeX);// 求行索引int row = fmod(index / _SizeX, _SizeY); //這步多加了取余數操作,可以循環播放動畫// 原始UV + 當前格增量cellUV.x += col * deltaX; //確定x的區間cellUV.y += row * deltaY; //確定y的區間 // 創建tex2d(材質,uv)*主色fixed4 c = tex2D(_MainTex, cellUV) * _Color;// RGBo.Albedo = c.rgb;// 透明度o.Alpha = c.a;}ENDCG} }
附上工程鏈接:http://download.csdn.net/detail/yinfourever/9563256
總結
以上是生活随笔為你收集整理的1.逐帧动画shader的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 光大携程菁英白金信用卡年费多少?免年费攻
- 下一篇: 光大携程菁英白金信用卡额度是多少?附赠提