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

  • 相关阅读:
    理解mipi协议【转】
    Using KernelShark to analyze the real-time scheduler【转】
    内核栈溢出【转】
    检测内核的堆栈溢出【转】
    gcc 编译 + 选项【转】
    service mysqld start 报错:service mysqld start 报错 090517 13:34:15 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it. 090Can't open the mysql.plugin table. Please run mysql
    【推荐】MySQL Cluster报错及解决方法(不断更新中)
    MySQL Cluster 配置文件(config.ini)详解
    关于MySQL Cluster集群NoOfReplicas参数问题
    通过PHP current()函数获取未知字符键名数组第一个元素的值
  • 原文地址:https://www.cnblogs.com/2Yous/p/4209477.html
Copyright © 2011-2022 走看看