Unity3D ShaderLab 模拟纹理运动

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;



}

 

 Unity3D ShaderLab 模拟纹理运动

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

 

 Unity3D ShaderLab 模拟纹理运动Unity3D ShaderLab 模拟纹理运动

 

通过上面的过程看来,我们使用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--------------------------------------------------------------

你可能感兴趣的:(unity3d)