UnityShader之纹理贴图滚动实现(修改UV坐标)

刚打了一把彩虹6,被情景模式虐了 /(ㄒoㄒ)/

OK,物体的表面实现滚动纹理,这个技术可以用来做瀑布,河流,当然配合其他的复杂计算可以实现复杂的效果,这里只说简单的

其实思路很简单

1.不改光照,就一个主纹理,通过_Time方法,实现实时运行
2.获取UV坐标
3.UV坐标与实时变换叠加,最后apply输出

Shader "CookbookShaders/Chapter02/ScrollingUVs" 
{
    Properties 
    {
        _MainTint ("Diffuse Tint", Color) = (1,1,1,1)
        _MainTex ("Base (RGB)", 2D) = "white" {}
        //控制纹理滚动的速度,初始值设为
        _ScrollXSpeed ("X Scroll Speed", Range(0, 10)) = 2
        _ScrollYSpeed ("Y Scroll Speed", Range(0, 10)) = 2
    }

    SubShader 
    {
        //指定shader渲染非透明物体,为什么就不说了,前几篇提到了
        Tags { "RenderType"="Opaque" }
        LOD 200

        //CG代码块
        CGPROGRAM
        //编译指令,定义表面着色器,和将要使用的光照模型Lambert(漫反射)
        #pragma surface surf Lambert

        //声明属性关联
        fixed4 _MainTint;
        fixed _ScrollXSpeed;
        fixed _ScrollYSpeed;
        sampler2D _MainTex;

        //表面着色器输入结构体
        struct Input 
        {
            //主纹理的UV坐标值
            //当获取到uv坐标值后,便可以通过修改在纹理上的uv坐标实现纹理滚动
            float2 uv_MainTex;
        };

        //表面着色器 使用了标准输出结构
        void surf (Input IN, inout SurfaceOutput o) 
        {
            //创建单独的变量储存uv坐标
            //最后我们会将新的变量传递给tex2D函数
            fixed2 scrolledUV = IN.uv_MainTex;

            //创建变量,单独储存x,y方向上的滚动速度
            //也就是说单位时间内,uv在x方向上的偏移量为_ScrollXSpeed * _Time    
            //y同理
            fixed xScrollValue = _ScrollXSpeed * _Time;
            fixed yScrollValue = _ScrollYSpeed * _Time;

            //应用最终的uv坐标偏移量
            scrolledUV += fixed2(xScrollValue, yScrollValue);

            //将变换后的uv坐标应用到纹理中
            half4 c = tex2D (_MainTex, scrolledUV);

            //为什么乘以_MainTint呢?大家写出来,调下_MainTint的颜色就知道了
            o.Albedo = c.rgb * _MainTint;
            o.Alpha = c.a;
        }
        ENDCG
    } 
    FallBack "Diffuse"
}

UnityShader之纹理贴图滚动实现(修改UV坐标)_第1张图片

这个还是挺简单的,还不知道怎么上传GIF,今天也不想弄了,有没有大哥带我玩彩虹6呢/(ㄒoㄒ)/~~(心里苦)

你可能感兴趣的:(unity3d特效)