【着色器实现Twist扭曲穿越形变效果_Shader效果第二十篇】

简介: 【着色器实现Twist扭曲穿越形变效果_Shader效果第二十篇】

Shader "Twist"
{
    Properties
    {
        _MainTex ("Main Texture", 2D) = "white" {}
    _Color("Main Color", Color) = (1,1,1,1)
    _TwistUvAmount("Twist Amount", Range(0, 3.1416)) = 1
    _TwistUvPosX("Twist Pos X Axis", Range(0, 1)) = 0.5
    _TwistUvPosY("Twist Pos Y Axis", Range(0, 1)) = 0.5
    _TwistUvRadius("Twist Radius", Range(0, 3)) = 0.75
    }

    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, _Color;
      half _TwistUvAmount, _TwistUvPosX, _TwistUvPosY, _TwistUvRadius;

            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
            {
        half2 tempUv = i.uv - half2(_TwistUvPosX *  _MainTex_ST.x, _TwistUvPosY *  _MainTex_ST.y);
        _TwistUvRadius *= (_MainTex_ST.x + _MainTex_ST.y) / 2;
        half percent = (_TwistUvRadius - length(tempUv)) / _TwistUvRadius;
        half theta = percent * percent * (2.0 * sin(_TwistUvAmount)) * 8.0;
        half s = sin(theta);
        half c = cos(theta);
        half beta = max(sign(_TwistUvRadius - length(tempUv)), 0.0);
        tempUv = half2(dot(tempUv, half2(c, -s)), dot(tempUv, half2(s, c))) * beta +  tempUv * (1 - beta);
        tempUv += half2(_TwistUvPosX *  _MainTex_ST.x, _TwistUvPosY *  _MainTex_ST.y);
        i.uv = tempUv;

        half4 col = tex2D(_MainTex, i.uv) * i.color;
        col *= _Color;
                return col;
            }
            ENDCG
        }
    }
  Fallback "Sprites/Default"
}
相关文章
|
8月前
|
存储 vr&ar 图形学
法线贴图的视线原理
使用法线贴图可以大大提高渲染效果,使低多边形数的模型看起来具有高多边形数模型的细节和真实感。在游戏开发、电影制作和虚拟现实等领域,法线贴图被广泛应用于增强场景和物体的视觉效果。
106 2
|
16天前
【着色器实现HandDrawn简笔画抖动效果_Shader效果第十二篇】
【着色器实现HandDrawn简笔画抖动效果_Shader效果第十二篇】
|
16天前
【着色器实现FishEye鱼眼画面膨胀效果_Shader效果第十六篇】
【着色器实现FishEye鱼眼画面膨胀效果_Shader效果第十六篇】
|
16天前
【着色器实现Glow可控局部发光效果_Shader效果第十三篇】
【着色器实现Glow可控局部发光效果_Shader效果第十三篇】
|
16天前
【着色器实现Pixelate马赛克效果_Shader效果第七篇】
【着色器实现Pixelate马赛克效果_Shader效果第七篇】
|
16天前
【着色器实现RoundWave圆形波纹效果_Shader效果第六篇】
【着色器实现RoundWave圆形波纹效果_Shader效果第六篇】
|
16天前
【着色器实现Glitch单项故障闪烁效果(与Television效果不同)_Shader效果第十四篇】
【着色器实现Glitch单项故障闪烁效果(与Television效果不同)_Shader效果第十四篇】
|
5月前
|
存储 Web App开发 缓存
像素是怎样练成的(四)
像素是怎样练成的(四)
|
5月前
|
缓存 JavaScript 前端开发
像素是怎样练成的(三)
像素是怎样练成的(三)
|
5月前
|
Web App开发 XML JavaScript
像素是怎样练成的(二)
像素是怎样练成的(二)