unity各种特效shader效果资源以及位置
阅读原文时间:2021年04月24日阅读:1

录制自己的视频或者写博客

实时更新
学习unity资源商店的Demo
多在资源商店逛逛很重要
shader必须学,shader的基础是3D图形学

unityTextMeshPro中文字体制作

https://blog.csdn.net/qq_37057633/article/details/81120583?utm_source=blogxgwz1

unity镜子效果资源资源商店搜索MagicMirror
unity打破玻璃效果  资源商店搜索Breakable Windows
unity合并mesh减少DrawCall  资源商店搜索搜索Simplest mesh  baker

unityOutline边框效果,用法直接把shader符合该物体,作为物体的子物体

//======= Copyright (c) Valve Corporation, All rights reserved. ===============
//
// Purpose: Used to show the outline of the object
//
//=============================================================================
// UNITY_SHADER_NO_UPGRADE
Shader "Valve/VR/Outline"
{
    //-------------------------------------------------------------------------------------------------------------------------------------------------------------
    Properties
    {
        g_vOutlineColor( "Outline Color", Color ) = ( .5, .5, .5, 1 )
        g_flOutlineWidth( "Outline width", Range ( .001, 0.03 ) ) = .005
        g_flCornerAdjust( "Corner Adjustment", Range( 0, 2 ) ) = .5
    }

    //-------------------------------------------------------------------------------------------------------------------------------------------------------------
    CGINCLUDE

        //-------------------------------------------------------------------------------------------------------------------------------------------------------------
        #pragma target 5.0

        //-------------------------------------------------------------------------------------------------------------------------------------------------------------
        #include "UnityCG.cginc"

        //-------------------------------------------------------------------------------------------------------------------------------------------------------------
        float4 g_vOutlineColor;
        float g_flOutlineWidth;
        float g_flCornerAdjust;

        //-------------------------------------------------------------------------------------------------------------------------------------------------------------
        struct VS_INPUT
        {
            float4 vPositionOs : POSITION;
            float3 vNormalOs : NORMAL;
        };

        //-------------------------------------------------------------------------------------------------------------------------------------------------------------
        struct PS_INPUT
        {
            float4 vPositionOs : TEXCOORD0;
            float3 vNormalOs : TEXCOORD1;
            float4 vPositionPs : SV_POSITION;
        };

        //-------------------------------------------------------------------------------------------------------------------------------------------------------------
        PS_INPUT MainVs( VS_INPUT i )
        {
            PS_INPUT o;
            o.vPositionOs.xyzw = i.vPositionOs.xyzw;
            o.vNormalOs.xyz = i.vNormalOs.xyz;
#if UNITY_VERSION >= 540
            o.vPositionPs = UnityObjectToClipPos( i.vPositionOs.xyzw );
#else
            o.vPositionPs = mul( UNITY_MATRIX_MVP, i.vPositionOs.xyzw );
#endif
            return o;
        }

        //-------------------------------------------------------------------------------------------------------------------------------------------------------------
        PS_INPUT Extrude( PS_INPUT vertex )
        {
            PS_INPUT extruded = vertex;

            // Offset along normal in projection space
            float3 vNormalVs = mul( ( float3x3 )UNITY_MATRIX_IT_MV, vertex.vNormalOs.xyz );
            float2 vOffsetPs = TransformViewToProjection( vNormalVs.xy );
            vOffsetPs.xy = normalize( vOffsetPs.xy );

            // Calculate position
#if UNITY_VERSION >= 540
            extruded.vPositionPs = UnityObjectToClipPos( vertex.vPositionOs.xyzw );
#else
            extruded.vPositionPs = mul( UNITY_MATRIX_MVP, vertex.vPositionOs.xyzw );
#endif
            extruded.vPositionPs.xy += vOffsetPs.xy * extruded.vPositionPs.w * g_flOutlineWidth;

            return extruded;
        }

        //-------------------------------------------------------------------------------------------------------------------------------------------------------------
        [maxvertexcount(18)]
        void ExtrudeGs( triangle PS_INPUT inputTriangle[3], inout TriangleStream<PS_INPUT> outputStream )
        {
            float3 a = normalize(inputTriangle[0].vPositionOs.xyz - inputTriangle[1].vPositionOs.xyz);
            float3 b = normalize(inputTriangle[1].vPositionOs.xyz - inputTriangle[2].vPositionOs.xyz);
            float3 c = normalize(inputTriangle[2].vPositionOs.xyz - inputTriangle[0].vPositionOs.xyz);

            inputTriangle[0].vNormalOs = inputTriangle[0].vNormalOs + normalize( a - c) * g_flCornerAdjust;
            inputTriangle[1].vNormalOs = inputTriangle[1].vNormalOs + normalize(-a + b) * g_flCornerAdjust;
            inputTriangle[2].vNormalOs = inputTriangle[2].vNormalOs + normalize(-b + c) * g_flCornerAdjust;

            PS_INPUT extrudedTriangle0 = Extrude( inputTriangle[0] );
            PS_INPUT extrudedTriangle1 = Extrude( inputTriangle[1] );
            PS_INPUT extrudedTriangle2 = Extrude( inputTriangle[2] );

            outputStream.Append( inputTriangle[0] );
            outputStream.Append( extrudedTriangle0 );
            outputStream.Append( inputTriangle[1] );
            outputStream.Append( extrudedTriangle0 );
            outputStream.Append( extrudedTriangle1 );
            outputStream.Append( inputTriangle[1] );

            outputStream.Append( inputTriangle[1] );
            outputStream.Append( extrudedTriangle1 );
            outputStream.Append( extrudedTriangle2 );
            outputStream.Append( inputTriangle[1] );
            outputStream.Append( extrudedTriangle2 );
            outputStream.Append( inputTriangle[2] );

            outputStream.Append( inputTriangle[2] );
            outputStream.Append( extrudedTriangle2 );
            outputStream.Append(inputTriangle[0]);
            outputStream.Append( extrudedTriangle2 );
            outputStream.Append( extrudedTriangle0 );
            outputStream.Append( inputTriangle[0] );
        }

        //-------------------------------------------------------------------------------------------------------------------------------------------------------------
        fixed4 MainPs( PS_INPUT i ) : SV_Target
        {
            return g_vOutlineColor;
        }

        //-------------------------------------------------------------------------------------------------------------------------------------------------------------
        fixed4 NullPs( PS_INPUT i ) : SV_Target
        {
            return float4( 1.0, 0.0, 1.0, 1.0 );
        }

    ENDCG

    SubShader
    {
        Tags { "RenderType"="Outline" "Queue" = "Geometry-1"  }

        //-------------------------------------------------------------------------------------------------------------------------------------------------------------
        // Render the object with stencil=1 to mask out the part that isn't the silhouette
        //-------------------------------------------------------------------------------------------------------------------------------------------------------------
        Pass
        {
            Tags { "LightMode" = "Always" }
            ColorMask 0
            Cull Off
            ZWrite Off
            Stencil
            {
                Ref 1
                Comp always
                Pass replace
            }

            CGPROGRAM
                #pragma vertex MainVs
                #pragma fragment NullPs
            ENDCG
        }

        //-------------------------------------------------------------------------------------------------------------------------------------------------------------
        // Render the outline by extruding along vertex normals and using the stencil mask previously rendered. Only render depth, so that the final pass executes
        // once per fragment (otherwise alpha blending will look bad).
        //-------------------------------------------------------------------------------------------------------------------------------------------------------------
        Pass
        {
            Tags { "LightMode" = "Always" }
            Cull Off
            ZWrite On
            Stencil
            {
                Ref 1
                Comp notequal
                Pass keep
                Fail keep
            }

            CGPROGRAM
                #pragma vertex MainVs
                #pragma geometry ExtrudeGs
                #pragma fragment MainPs
            ENDCG
        }
    }
}

UIOverlay效果

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

Shader "UI/Overlay"
{
    Properties
    {
        [PerRendererData] _MainTex ("Font Texture", 2D) = "white" {}

        _Color("Tint", Color) = (1,1,1,1)

        _StencilComp ("Stencil Comparison", Float) = 8
        _Stencil ("Stencil ID", Float) = 0
        _StencilOp ("Stencil Operation", Float) = 0
        _StencilWriteMask ("Stencil Write Mask", Float) = 255
        _StencilReadMask ("Stencil Read Mask", Float) = 255

        _ColorMask ("Color Mask", Float) = 15
    }

    SubShader
    {
        LOD 100

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

        Stencil
        {
            Ref [_Stencil]
            Comp [_StencilComp]
            Pass [_StencilOp] 
            ReadMask [_StencilReadMask]
            WriteMask [_StencilWriteMask]
        }

        Cull Off
        Lighting Off
        ZWrite Off
        ZTest Always
        Offset -1, -1
        Blend SrcAlpha OneMinusSrcAlpha
        ColorMask [_ColorMask]

        Pass
        {
            CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag
                #include "UnityCG.cginc"
                #include "UnityUI.cginc"

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

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

                sampler2D _MainTex;
                float4 _MainTex_ST;
                fixed4 _Color;
                fixed4 _TextureSampleAdd;

                v2f vert (appdata_t v)
                {
                    v2f o;
                    o.vertex = UnityObjectToClipPos(v.vertex);
                    o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
                    o.color = v.color * _Color;
#ifdef UNITY_HALF_TEXEL_OFFSET
                    o.vertex.xy += (_ScreenParams.zw-1.0)*float2(-1,1);
#endif

                    return o;
                }

                fixed4 frag (v2f i) : SV_Target
                {
                    fixed4 col = (tex2D(_MainTex, i.texcoord) + _TextureSampleAdd) * i.color;
                    clip (col.a - 0.01);
                    return col;
                }
            ENDCG
        }
    }
}

高亮效果

//======= Copyright (c) Valve Corporation, All rights reserved. ===============
//
// Purpose: Used for the teleport markers
//
//=============================================================================
// UNITY_SHADER_NO_UPGRADE
Shader "Valve/VR/Highlight"
{
    Properties
    {
        _TintColor( "Tint Color", Color ) = ( 1, 1, 1, 1 )
        _SeeThru( "SeeThru", Range( 0.0, 1.0 ) ) = 0.25
        _Darken( "Darken", Range( 0.0, 1.0 ) ) = 0.0
        _MainTex( "MainTex", 2D ) = "white" {}
    }

    //-------------------------------------------------------------------------------------------------------------------------------------------------------------
    CGINCLUDE

        // Pragmas --------------------------------------------------------------------------------------------------------------------------------------------------
        #pragma target 5.0
        #pragma only_renderers d3d11 vulkan
        #pragma exclude_renderers gles

        // Includes -------------------------------------------------------------------------------------------------------------------------------------------------
        #include "UnityCG.cginc"

        // Structs --------------------------------------------------------------------------------------------------------------------------------------------------
        struct VertexInput
        {
            float4 vertex : POSITION;
            float2 uv : TEXCOORD0;
            fixed4 color : COLOR;
        };

        struct VertexOutput
        {
            float2 uv : TEXCOORD0;
            float4 vertex : SV_POSITION;
            fixed4 color : COLOR;
        };

        // Globals --------------------------------------------------------------------------------------------------------------------------------------------------
        sampler2D _MainTex;
        float4 _MainTex_ST;
        float4 _TintColor;
        float _SeeThru;
        float _Darken;

        // MainVs ---------------------------------------------------------------------------------------------------------------------------------------------------
        VertexOutput MainVS( VertexInput i )
        {
            VertexOutput o;
#if UNITY_VERSION >= 540
            o.vertex = UnityObjectToClipPos(i.vertex);
#else
            o.vertex = mul(UNITY_MATRIX_MVP, i.vertex);
#endif
            o.uv = TRANSFORM_TEX( i.uv, _MainTex );
            o.color = i.color;

            return o;
        }

        // MainPs ---------------------------------------------------------------------------------------------------------------------------------------------------
        float4 MainPS( VertexOutput i ) : SV_Target
        {
            float4 vTexel = tex2D( _MainTex, i.uv ).rgba;
            float4 vColor = vTexel.rgba * _TintColor.rgba * i.color.rgba;
            vColor.rgba = saturate( 2.0 * vColor.rgba );
            float flAlpha = vColor.a;

            vColor.rgb *= vColor.a;
            vColor.a = lerp( 0.0, _Darken, flAlpha );

            return vColor.rgba;
        }

        // MainPs ---------------------------------------------------------------------------------------------------------------------------------------------------
        float4 SeeThruPS( VertexOutput i ) : SV_Target
        {
            float4 vTexel = tex2D( _MainTex, i.uv ).rgba;
            float4 vColor = vTexel.rgba * _TintColor.rgba * i.color.rgba * _SeeThru;
            vColor.rgba = saturate( 2.0 * vColor.rgba );
            float flAlpha = vColor.a;

            vColor.rgb *= vColor.a;
            vColor.a = lerp( 0.0, _Darken, flAlpha * _SeeThru );

            return vColor.rgba;
        }

    ENDCG

    SubShader
    {
        Tags{ "Queue" = "Transparent" "RenderType" = "Transparent" }
        LOD 100

        // Behind Geometry ---------------------------------------------------------------------------------------------------------------------------------------------------
        Pass
        {
            // Render State ---------------------------------------------------------------------------------------------------------------------------------------------
            Blend One OneMinusSrcAlpha
            Cull Off
            ZWrite Off
            ZTest Greater

            CGPROGRAM
                #pragma vertex MainVS
                #pragma fragment SeeThruPS
            ENDCG
        }

        Pass
        {
            // Render State ---------------------------------------------------------------------------------------------------------------------------------------------
            Blend One OneMinusSrcAlpha
            Cull Off
            ZWrite Off
            ZTest LEqual

            CGPROGRAM
                #pragma vertex MainVS
                #pragma fragment MainPS
            ENDCG
        }
    }
}

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章