Giter VIP home page Giter VIP logo

anime-speed-lines's Introduction

Anime Speed Lines

Unity Version Unity Pipeline Support (Built-In) Unity Pipeline Support (URP) Unity Pipeline Support (HDRP)

GitHub followers Twitter Follow YouTube Channel Views YouTube Channel Subscribers

Post-processing effect to procedurally generate an anime/manga-style vignette of lines typically used to portray speed or surprise.

Stars Forks GitHub watchers GitHub repo size GitHub code size in bytes

Preview

Anime.Speed.Lines.URP.mp4
2022-01-29.04-53-33.mp4

Compatibility

  • Built-in pipeline + URP.
  • Tested with Unity 2020.3 (LTS).
  • Can be edited using Amplify Shader Editor.

Installation

You'll find everything under Mirza Beig/Anime Speed Lines/...

Usage

Built-In

Attach CustomPostProcessing to your camera, and assign the included Anime Speed Lines material (or make your own).

image

URP

Instead of attaching a script to the camera, add CustomRenderPassFeature to your URP pipeline asset renderer and assign the material there. Alternatively, you can use the included URP pipeline asset under Mirza Beig/Anime Speed Lines/Rendering/.

image

You can adjust opacity through the colour alpha.

Social Media

License

Unlicense (do whatever you want with this)...

Support/Donate...

This is a FREE asset. However, if you'd like, you can support me via one of the sponsor links on the side.

Every bit is appreciated!

Patrons/Supporters (Thank You!)

  • Adam Mulvey
  • Shawn Tanner

anime-speed-lines's People

Contributors

mirzabeig avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

anime-speed-lines's Issues

Not Working on Latest URP 14+, black screen on build

For someone who's looking on it, but it's causing black screen on build.
after URP update version 14. a lot of stuff is obsolete.

there's 2 things that causing this not working

  1. the urp isn't recommending to use cmd.Blit because it's obsolete not optimized and cause conflict on XR.
  2. the shader is using CGPROGRAM which not supported in URP.

for you guys who's using URP 14+ you can use my code below

RendererFeature

using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;

public class SpeedLineRenderPassFeature : ScriptableRendererFeature
{
    [System.Serializable]
    public class CustomRenderPassSettings
    {
        public Material material;
        public RenderPassEvent renderPassEvent = RenderPassEvent.AfterRenderingPostProcessing;
    }

    SpeedLineRenderPass m_ScriptablePass;
    
    public CustomRenderPassSettings settings = new CustomRenderPassSettings();

    /// <inheritdoc/>
    /// 
    public override void Create()
    {
        m_ScriptablePass = new SpeedLineRenderPass(settings);
    }

    // Here you can inject one or multiple render passes in the renderer.
    // This method is called when setting up the renderer once per-camera.

    public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
    {
        // we dont wan't to run the pass if there is no material
        if (settings.material == null)
        {
            Debug.LogError("Render Pass `SpeedLineRenderPassFeature` missing material");
            return;
        }

        //RenderTargetIdentifier source = renderer.cameraColorTarget;
        //m_ScriptablePass.Setup(source);
        if (renderingData.cameraData.cameraType == CameraType.Game)
            renderer.EnqueuePass(m_ScriptablePass);
    }

    public override void SetupRenderPasses(ScriptableRenderer renderer, in RenderingData renderingData)
    {
        if (renderingData.cameraData.cameraType == CameraType.Game)
        {
            // Calling ConfigureInput with the ScriptableRenderPassInput.Color argument
            // ensures that the opaque texture is available to the Render Pass.
            m_ScriptablePass.ConfigureInput(ScriptableRenderPassInput.Color | ScriptableRenderPassInput.Depth | ScriptableRenderPassInput.Normal | ScriptableRenderPassInput.Motion);
            m_ScriptablePass.SetTarget(renderer.cameraColorTargetHandle);
        }
    }

    class SpeedLineRenderPass : ScriptableRenderPass
    {
        RTHandle m_CameraColorTarget;

        // store settings instead of material itself
        SpeedLineRenderPassFeature.CustomRenderPassSettings settings;

        // name this what you want, it will be used to name the profile in frame debugger
        const string profilingName = "SpeedLineRender-Pass";


        public SpeedLineRenderPass(SpeedLineRenderPassFeature.CustomRenderPassSettings settings)
        {
            // storing the settings allows you to add more features faster without having to boiler plate code,
            // also ensures that any changes made in the render feature reflect in the pass
            this.settings = settings;
            renderPassEvent = settings.renderPassEvent;

            // create a new profiling sampler with are chosen name,
            // else you get just a generic "ScriptableRendererPass" name
            this.profilingSampler = new ProfilingSampler(profilingName);
        }

        public void SetTarget(RTHandle colorHandle)
        {
            // get the source target from rendering data every frame
            m_CameraColorTarget = colorHandle;
        }

        public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData)
        {
            ConfigureTarget(m_CameraColorTarget);
        }

        public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
        {
            var cameraData = renderingData.cameraData;
            if (cameraData.camera.cameraType != CameraType.Game)
                return;

            CommandBuffer cmd = CommandBufferPool.Get(nameof(SpeedLineRenderPass));
            using (new ProfilingScope(cmd, profilingSampler))
            {
                Blitter.BlitCameraTexture(cmd, m_CameraColorTarget, m_CameraColorTarget, settings.material, 0);
            }
            context.ExecuteCommandBuffer(cmd);
            cmd.Clear();

            CommandBufferPool.Release(cmd);
        }
    }
}

Shader

Shader "Mirza/Anime Speed Lines"
{
    Properties
    {
        _MainTex("Screen", 2D) = "black" {}
        _Colour("Colour", Color) = (1, 1, 1, 1)
        _SpeedLinesTiling("Speed Lines Tiling", Float) = 200
        _SpeedLinesRadialScale("Speed Lines Radial Scale", Range(0, 10)) = 0.1
        _SpeedLinesPower("Speed Lines Power", Float) = 1
        _SpeedLinesRemap("Speed Lines Remap", Range(0, 1)) = 0.8
        _SpeedLinesAnimation("Speed Lines Animation", Float) = 3
        _MaskScale("Mask Scale", Range(0, 2)) = 1
        _MaskHardness("Mask Hardness", Range(0, 1)) = 0
        _MaskPower("Mask Power", Float) = 5
        [HideInInspector] _texcoord("", 2D) = "white" {}
        _SpeedLinesEnabled("Enable Speed Lines", Range(0, 1)) = 0
    }


    SubShader
    {
        LOD 0

        ZTest Always
        Cull Off
        ZWrite Off

        Pass
        {
            HLSLPROGRAM
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
            #include "Packages/com.unity.render-pipelines.core/Runtime/Utilities/Blit.hlsl"
            #pragma vertex vert
            #pragma fragment frag

            
            struct appdata_img_custom
            {
                #if SHADER_API_GLES
                float4 vertex : POSITION;
                half2 texcoord : TEXCOORD0;
                #else
                uint vertexID : SV_VertexID;
                #endif
            };

            struct v2f_img_custom
            {
                float4 pos : SV_POSITION;
                half2 uv : TEXCOORD0;
                half2 stereoUV : TEXCOORD2;

                #if UNITY_UV_STARTS_AT_TOP
                half4 uv2 : TEXCOORD1;
                half4 stereoUV2 : TEXCOORD3;
                #endif
            };

            sampler2D _MainTex;
            half4 _MainTex_TexelSize;
            half4 _MainTex_ST;

            TEXTURE2D_X(_CameraOpaqueTexture);
            SAMPLER(sampler_CameraOpaqueTexture);

            float _SpeedLinesRadialScale;
            float _SpeedLinesTiling;
            float _SpeedLinesAnimation;
            float _SpeedLinesPower;
            float _SpeedLinesRemap;
            float _MaskScale;
            float _MaskHardness;
            float _MaskPower;
            float4 _Colour;
            float _SpeedLinesEnabled;

            float3 mod2D289(float3 x) { return x - floor(x * (1.0 / 289.0)) * 289.0; }
            float2 mod2D289(float2 x) { return x - floor(x * (1.0 / 289.0)) * 289.0; }
            float3 permute(float3 x) { return mod2D289(((x * 34.0) + 1.0) * x); }
            float snoise(float2 v)
            {
                const float4 C = float4(0.211324865405187, 0.366025403784439, -0.577350269189626, 0.024390243902439);
                float2 i = floor(v + dot(v, C.yy));
                float2 x0 = v - i + dot(i, C.xx);
                float2 i1;
                i1 = (x0.x > x0.y) ? float2(1.0, 0.0) : float2(0.0, 1.0);
                float4 x12 = x0.xyxy + C.xxzz;
                x12.xy -= i1;
                i = mod2D289(i);
                float3 p = permute(permute(i.y + float3(0.0, i1.y, 1.0)) + i.x + float3(0.0, i1.x, 1.0));
                float3 m = max(0.5 - float3(dot(x0, x0), dot(x12.xy, x12.xy), dot(x12.zw, x12.zw)), 0.0);
                m = m * m;
                m = m * m;
                float3 x = 2.0 * frac(p * C.www) - 1.0;
                float3 h = abs(x) - 0.5;
                float3 ox = floor(x + 0.5);
                float3 a0 = x - ox;
                m *= 1.79284291400159 - 0.85373472095314 * (a0 * a0 + h * h);
                float3 g;
                g.x = a0.x * x0.x + h.x * x0.y;
                g.yz = a0.yz * x12.xz + h.yz * x12.yw;
                return 130.0 * dot(m, g);
            }

            half4 ComputeGrabScreenPos(half2 uv, half4 screenPos)
            {
                return half4((screenPos.xy + uv * screenPos.zw), 0, 0);
            }

            v2f_img_custom vert(appdata_img_custom v)
            {
                v2f_img_custom output;
                UNITY_SETUP_INSTANCE_ID(input);
                UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
                
            #if SHADER_API_GLES
                float4 pos = v.vertex;
                float2 uv  = v.texcoord;
            #else
                float4 pos = GetFullScreenTriangleVertexPosition(v.vertexID);
                float2 uv  = GetFullScreenTriangleTexCoord(v.vertexID);
            #endif

                output.pos = pos;
                output.uv = uv * _BlitScaleBias.xy + _BlitScaleBias.zw;

                #if UNITY_UV_STARTS_AT_TOP
                output.uv2 = float4(pos.xy, 1, 1);
                output.stereoUV2 = ComputeGrabScreenPos(output.uv2, _MainTex_ST);

                if (_MainTex_TexelSize.y < 0.0)
                {
                    output.uv.y = 1.0 - output.uv.y;
                }
                #endif
                output.stereoUV = ComputeGrabScreenPos(output.uv, _MainTex_ST);

                return output;

            }


            half4 frag(v2f_img_custom i) : SV_Target
            {
                #ifdef UNITY_UV_STARTS_AT_TOP
                half2 uv = i.uv2;
                half2 stereoUV = i.stereoUV2;
                #else
                half2 uv = i.uv;
                half2 stereoUV = i.stereoUV;
                #endif

                half4 finalColor;

                // ase common template code
                float2 uv_MainTex = i.uv.xy * _MainTex_ST.xy + _MainTex_ST.zw;
                //float4 SceneColour7 = tex2D(_MainTex, uv_MainTex);
                float4 SceneColour7 = SAMPLE_TEXTURE2D_X(_CameraOpaqueTexture, sampler_CameraOpaqueTexture, i.uv);

                // Check if the shader effect is enabled
                if (_SpeedLinesEnabled > 0)
                {
                    // Your existing shader effect code here
                    // ...

                    // Your existing shader code for the effect
                    // ...
                    float2 CenteredUV15_g1 = (i.uv.xy - float2(0.5, 0.5));
                    float2 break17_g1 = CenteredUV15_g1;
                    float2 appendResult23_g1 = (float2((length(CenteredUV15_g1) * _SpeedLinesRadialScale * 2.0), (atan2(break17_g1.x, break17_g1.y) * (1.0 / 6.28318548202515) * _SpeedLinesTiling)));
                    float2 appendResult58 = (float2((-_SpeedLinesAnimation * _Time.y), 0.0));
                    float simplePerlin2D10 = snoise((appendResult23_g1 + appendResult58));
                    simplePerlin2D10 = simplePerlin2D10 * 0.5 + 0.5;
                    float temp_output_1_0_g6 = _SpeedLinesRemap;
                    float SpeedLines21 = saturate(((pow(simplePerlin2D10, _SpeedLinesPower) - temp_output_1_0_g6) / (1.0 - temp_output_1_0_g6)));
                    float2 texCoord60 = i.uv.xy * float2(2, 2) + float2(-1, -1);
                    float temp_output_1_0_g5 = _MaskScale;
                    float lerpResult71 = lerp(0.0, _MaskScale, _MaskHardness);
                    float Mask24 = pow((1.0 - saturate((length(texCoord60) - temp_output_1_0_g5) / ((lerpResult71 - 0.001) - temp_output_1_0_g5))), _MaskPower);
                    float MaskedSpeedLines29 = (SpeedLines21 * Mask24);
                    float3 ColourRGB38 = (_Colour).rgb;
                    float ColourA40 = _Colour.a;
                    float4 lerpResult2 = lerp(SceneColour7, float4((MaskedSpeedLines29 * ColourRGB38), 0.0), (MaskedSpeedLines29 * ColourA40));

                    finalColor = lerpResult2;
                }
                else
                {
                    // If the effect is disabled, simply output the original color
                    finalColor = SceneColour7;
                }
                
                //return finalColor;
                //float4 color = SAMPLE_TEXTURE2D_X(_CameraOpaqueTexture, sampler_CameraOpaqueTexture, i.uv);
                return finalColor;
            }

            ENDHLSL
        }
    }
}

Reference :
Perform a full screen blit in URP | Universal RP | 14.0.9 (unity3d.com)
Unity - Manual: ShaderLab: adding shader programs (unity3d.com)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.