• sprite实现影子


    2d项目需要实现影子效果,sprite实现效果不理想,为了实现高分辨率的影子,使用shader的一个pass实现影子:这里直接上代码

    // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

    // RGB sprite split shader test unitycoder.com
    Shader "RXS/SpriteShadow"
    {
    Properties
    {
    [PerRendererData] _MainTex("Sprite Texture", 2D) = "white" {}
    // _Color ("Tint", Color) = (1,1,1,1)
    [MaterialToggle] PixelSnap("Pixel snap", Float) = 0
    _RedOffsetX("RedOffsetX", Float) = 0
    _RedOffsetY("RedOffsetY", Float) = 0
    _GreenOffsetX("GreenOffsetX", Float) = 0
    _GreenOffsetY("GreenOffsetY", Float) = 0
    _BlueOffsetX("BlueOffsetX", Float) = 0
    _BlueOffsetY("BlueOffsetY", Float) = 0
    }

    SubShader
    {
    Tags
    {
    "Queue" = "Transparent"
    "IgnoreProjector" = "True"
    "RenderType" = "Transparent"
    "PreviewType" = "Plane"
    "CanUseSpriteAtlas" = "True"
    }

    Cull Off
    Lighting Off
    ZWrite Off
    Fog{ Mode Off }
    // Blend SrcAlpha OneMinusSrcAlpha
    // Blend SrcAlpha OneMinusSrcAlpha // Soft Additiv


    // shadow
    Pass
    {
    Blend SrcAlpha OneMinusSrcAlpha // Soft Additiv
    //Blend One One // Additive
    CGPROGRAM
    #pragma vertex vert
    #pragma fragment frag
    #pragma multi_compile DUMMY PIXELSNAP_ON
    #include "UnityCG.cginc"

    struct appdata_t
    {
    float4 vertex : POSITION;
    float4 color : COLOR;
    float2 texcoord : TEXCOORD0;
    };

    struct v2f
    {
    float4 vertex : SV_POSITION;
    fixed4 color : COLOR;
    half2 texcoord : TEXCOORD0;
    };

    //fixed4 _Color;
    float _BlueOffsetX;
    float _BlueOffsetY;

    v2f vert(appdata_t IN)
    {
    v2f OUT;
    OUT.vertex = UnityObjectToClipPos(IN.vertex);
    OUT.texcoord = IN.texcoord;
    // OUT.color = IN.color * _Color;
    OUT.color = float4(0,0,0,1);
    OUT.vertex.xy += float2(_BlueOffsetX,_BlueOffsetY);
    #ifdef PIXELSNAP_ON
    OUT.vertex = UnityPixelSnap(OUT.vertex);
    #endif

    return OUT;
    }

    sampler2D _MainTex;

    fixed4 frag(v2f IN) : COLOR
    {
    return (tex2D(_MainTex, IN.texcoord) * IN.color)*0.5;//;+float4(1,1,1,0.5);;
    }
    ENDCG
    } // end pass

    // texture
    Pass
    {
    //Blend One One
    Blend SrcAlpha OneMinusSrcAlpha // Soft Additiv
    // Blend One One // Additive
    CGPROGRAM
    #pragma vertex vert
    #pragma fragment frag
    #pragma multi_compile DUMMY PIXELSNAP_ON
    #include "UnityCG.cginc"

    struct appdata_t
    {
    float4 vertex : POSITION;
    float4 color : COLOR;
    float2 texcoord : TEXCOORD0;
    };

    struct v2f
    {
    float4 vertex : SV_POSITION;
    fixed4 color : COLOR;
    half2 texcoord : TEXCOORD0;
    };

    // fixed4 _Color;
    float _RedOffsetX;
    float _RedOffsetY;

    v2f vert(appdata_t IN)
    {
    v2f OUT;
    OUT.vertex = UnityObjectToClipPos(IN.vertex);
    OUT.texcoord = IN.texcoord;
    // OUT.color = IN.color * _Color;
    OUT.color = IN.color ;
    OUT.vertex.xy += float2(_RedOffsetX,_RedOffsetY);
    #ifdef PIXELSNAP_ON
    OUT.vertex = UnityPixelSnap(OUT.vertex);
    #endif

    return OUT;
    }

    sampler2D _MainTex;

    fixed4 frag(v2f IN) : COLOR
    {
    return tex2D(_MainTex, IN.texcoord);// *IN.color;
    }
    ENDCG
    }

    }
    }

    参考网站http://unitycoder.com/blog/2014/01/06/sprite-rgb-split-shader-test/

    游戏是由人创造出来的,你如果能够为开发人员提供高质量的工具,并帮助他们更好地完成自己的工作,包括帮助他们提高生产力、尝试新事物并进行实验,那么你就越有可能在这个行业中获得成功。
  • 相关阅读:
    程序中图片透明 函数(使用SetBkColor API函数)
    编程中使用锁
    event内存泄漏
    diskcache
    linux内核管理
    Vue
    Paxos算法
    索引以及页和区
    CoreRT
    二叉树
  • 原文地址:https://www.cnblogs.com/rxs123/p/7683697.html
Copyright © 2020-2023  润新知