Unity3D ShaderLab 模拟纹理运动

这一篇,我们要说到着色器上的uv贴图的滚动效果,这样的场景可以用在河流,瀑布,熔岩等效果。算是创建纹理动画的基础技术之一。

所以 准备一个新的着色器文件和一个新的材质。

这次我们首先在Properties中添加一些代码:

Properties {

_MainTint("Diffuse Tint",Color)=(1,1,1,1)

_MainTex ("Base (RGB)", 2D) = "white" {}

_ScrollXOff("X Offset",Range(0,10))=2.3

_ScrollYOff("Y Offset",Range(0,10))=2.5

}

 

其中的_MainTex是默认就有的哦。

接下来就要同时添加位于SubShaderCGPROGRAM的变量了。

float4 _MainTint;

sampler2D _MainTex;

float _ScrollXOff;

float _ScrollYOff;

 

再往下,就是修改surf函数了,通过tex2D()函数来改变uv坐标。通过内置的_Time来实现动态uv

void surf (Input IN, inout SurfaceOutput o) {

fixed2 scrollUV = IN.uv_MainTex;

fixed xOff = _ScrollXOff*_Time;

fixed yOff = _ScrollYOff*_Time;

scrollUV += fixed2(xOff,yOff);

 

half4 c = tex2D (_MainTex, scrollUV);

o.Albedo = c.rgb;

o.Alpha = c.a;

}

 

 

Finish 接下来就可以用刚写好的Shader在编辑器中运行观察了。

 

 

 

通过上面的过程看来,我们使用XY方向的参数来控制纹理2个方向的滚动速度。

在程序的开始,我们将uv的值存储在scrollUV 中,这是一个float2或者fixed2类型的变量,因为uv值是通过input结构体传入的。

当访问网格的uv时候,我们就可以使用滚动速度变量和内置的_Time变量进行纹理偏移。

说到_Time它是一个Unity游戏时钟的递增浮点值。

所以,我们可以使用它在uv方向上计算新的uv值,再把新的偏移值传递给原有的uv值,累加计算出来后传递给tex2D()作为新的uv纹理。

通过这些步骤,简单的模拟了纹理的运动效果。

 

code start------------------------------------------------------------

 

 

Shader "91YGame/BasicOffset" {
    Properties {
        _MainTint("Diffuse Tint",Color)=(1,1,1,1)
        _MainTex ("Base (RGB)", 2D) = "white" {}
        _ScrollXOff("X Offset",Range(0,10))=2.3
        _ScrollYOff("Y Offset",Range(0,10))=2.5
    }
    SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 200
        
        CGPROGRAM
        #pragma surface surf Lambert

        float4 _MainTint;
        sampler2D _MainTex;
        float _ScrollXOff;
        float _ScrollYOff;

        struct Input {
            float2 uv_MainTex;
        };

        void surf (Input IN, inout SurfaceOutput o) {
            fixed2 scrollUV = IN.uv_MainTex;
            fixed xOff = _ScrollXOff*_Time;
            fixed yOff = _ScrollYOff*_Time;
            scrollUV += fixed2(xOff,yOff);

            half4 c = tex2D (_MainTex, scrollUV);
            o.Albedo = c.rgb;
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

 

 



 

code end--------------------------------------------------------------