zoukankan      html  css  js  c++  java
  • 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;
    
    }

     

    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--------------------------------------------------------------

  • 相关阅读:
    LSMW TIPS
    Schedule agreement and Delfor
    Running VL10 in the background 13 Oct
    analyse idoc by creation date
    New Journey Prepare
    EDI error
    CBSN NEWS
    Listen and Write 18th Feb 2019
    Microsoft iSCSI Software Target 快照管理
    通过 Microsoft iSCSI Software Target 提供存储服务
  • 原文地址:https://www.cnblogs.com/2Yous/p/4209477.html
Copyright © 2011-2022 走看看