【着色器实现Swaying摇曳效果_Shader效果第四篇】

简介: 【着色器实现Swaying摇曳效果_Shader效果第四篇】

着色器实现Swaying效果,如图


属性栏如图


完整代码

Shader "Swaying"
{
    Properties
    {
        _MainTex ("Main Texture", 2D) = "white" {}
    _Color("Main Color", Color) = (1,1,1,1)
    _Alpha("General Alpha",  Range(0,1)) = 1

    _GrassSpeed("Speed", Range(0,50)) = 2
    _GrassWind("Bend amount", Range(0,50)) = 20

    _WaveAmount("Wave Amount", Range(0, 25)) = 7
    _WaveSpeed("Wave Speed", Range(0, 25)) = 10
    _WaveStrength("Wave Strength", Range(0, 25)) = 7.5
    _WaveX("Wave X Axis", Range(0, 1)) = 0
    _WaveY("Wave Y Axis", Range(0, 1)) = 0.5

    _ClipUvLeft("Clipping Left", Range(0, 1)) = 0
    _ClipUvRight("Clipping Right", Range(0, 1)) = 0
    _ClipUvUp("Clipping Up", Range(0, 1)) = 0
    _ClipUvDown("Clipping Down", Range(0, 1)) = 0
    }

    SubShader
    {
        Tags {"Queue" = "Transparent" "RenderType"="Opaque" "IgnoreProjector" = "True" }        
        Blend SrcAlpha OneMinusSrcAlpha
        ZWrite Off
        Cull Off

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"
            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
        half4 color : COLOR;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
        half4 color : COLOR;
            };

            sampler2D _MainTex;
            half4 _MainTex_ST, _MainTex_TexelSize, _Color;
      half _Alpha;
            float _RandomSeed;

      half _GrassSpeed, _GrassWind, _GrassRadialBend;
      float _WaveAmount, _WaveSpeed, _WaveStrength, _WaveX, _WaveY;
      half _ClipUvLeft, _ClipUvRight, _ClipUvUp, _ClipUvDown;

            v2f vert (appdata v)
            {
                v2f o;
        o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
        o.color = v.color;
                return o;
            }

            half4 frag (v2f i) : SV_Target
            {
        float2 uvRect = i.uv;
        half2 center = half2(0.5, 0.5);

        half windOffset = sin((_Time + _RandomSeed) * _GrassSpeed * 10);
        half2 windCenter = half2(0.5, 0.1);
        i.uv.x = fmod(abs(lerp(i.uv.x, i.uv.x + (_GrassWind * 0.01 * windOffset), uvRect.y)), 1);
        half2 delta = i.uv - windCenter;
        half delta2 = dot(delta.xy, delta.xy);
        half2 delta_offset = delta2 * windOffset;
        i.uv = i.uv + half2(delta.y, -delta.x) * delta_offset * _GrassRadialBend;

        float2 uvWave = half2(_WaveX *  _MainTex_ST.x, _WaveY *  _MainTex_ST.y) - i.uv;
              uvWave %= 1;
        uvWave.x *= _ScreenParams.x / _ScreenParams.y;
              float waveTime = _Time.y + _RandomSeed;
        float angWave = (sqrt(dot(uvWave, uvWave)) * _WaveAmount) - ((waveTime *  _WaveSpeed));
        i.uv = i.uv + uvWave * sin(angWave) * (_WaveStrength / 1000.0);

        half2 tiledUv = half2(i.uv.x / _MainTex_ST.x, i.uv.y / _MainTex_ST.y);
        clip((1 - _ClipUvUp) - tiledUv.y);
        clip(tiledUv.y - _ClipUvDown);
        clip((1 - _ClipUvRight) - tiledUv.x);
        clip(tiledUv.x - _ClipUvLeft);

        half4 col = tex2D(_MainTex, i.uv) * i.color;
        half originalAlpha = col.a;


        col.a *= _Alpha;
        col *= _Color;
                return col;
            }
            ENDCG
        }
    }
  Fallback "Sprites/Default"
}
相关文章
【着色器实现Pixelate马赛克效果_Shader效果第七篇】
【着色器实现Pixelate马赛克效果_Shader效果第七篇】
|
小程序 编译器 C语言
OpenGL学习笔记(十):深入学习和理解着色器
OpenGL学习笔记(十):深入学习和理解着色器
OpenGL学习笔记(十):深入学习和理解着色器
|
存储 图形学
【Aladdin Unity3D Shader编程】之四 贴图纹理
关于纹理贴图介绍 纹理坐标也叫UV坐标,UV坐标都是0~1,并不是我们所理解的像素坐标,相当于是一个百分比。 编写shader映射纹理 将纹理的颜色取代漫反射的颜色 Shader "AladdinShader/11 Single Texture Shader" ...
1729 0
|
图形学
【Aladdin Unity3D Shader编程】之三 光照模型(二)
高光反射模型 Specular=直射光*pow(cosθ,高光的参数) θ:是反射光和视野方向的夹角 编写高光反射Shader Shader "AladdinShader/07 Specular Vertex Shader" { Prop...
1565 0
|
图形学
【Aladdin Unity3D Shader编程】之二 光照模型(一)
光照模型 光照模型就是一个公式,使用这个公式来计算在某个点的光照效果。 在标准光照模型里面,我们把进入摄像机的光分为下面四个部分: * 自发光 类似生活中的萤火虫等自己能够发光 * 高光反射 类似生活中的镜子,近似认为百分百反射出去 * 漫反射 类似生活中的光照射到墙壁上、桌子上的反光不会百分百反射出去,各个方向都会反射。
1737 0
《OpenGL编程指南(原书第9版)》——第2章 2.0着色器基础
本节书摘来自华章计算机《OpenGL编程指南(原书第9版)》一书中的第2章,第2.1节,作者:(美)约翰·克赛尼希(John Kessenich)著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1309 0
《OpenGL编程指南(原书第9版)》——2.1 着色器与OpenGL
本节书摘来自华章计算机《OpenGL编程指南(原书第9版)》一书中的第2章,第2.1节,作者:(美)约翰·克赛尼希(John Kessenich)著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1437 0