Quantum Break'in bozulma partikül etkisini nasıl çoğaltabilirim?


68

Kuantum Arası bu fantastik partikül etkisine sahiptir, cam kırılması gibi bir bozulma etkisine sahiptir. Bu efekti nasıl çoğaltabileceğimi bilmek istiyorum? Aşağıda görebilirsiniz ve YouTube'da tam bir video var :

record_2018_02_05_16_34_26_307

record_2018_02_01_22_27_44_971


4
"Bu soru yeterince dikkat çekmedi." ?
Alexandre Vaillancourt

@AlexandreVaillancourt Ben sadece bu soruyu daha fazla görüş için işaretleyin ve yararlı olduğunu düşünüyorum çünkü dikkat çekiyorum. Ödül sebepleri üzerinde daha iyi bir neden bulamadım. Bir sorun varsa nedenimi değiştireceğim. Teşekkürler
Seyed Morteza Kamali

2
Ödüllerin amacı, gerçekte sadece soruları "tespit etmek" değildir; Belirtilen mantığınız biraz belirsiz. Ödüllerin amacı, cevaplanması gereken sorulara dikkat çekmek veya sizinkilerin yapmadığı mevcut cevapları ödüllendirmektir. Topluluğun faydalı ve ilginç olduğunu düşündüğü konuları ödüllendirmek için zaten mevcut olan mekanizmalar (görevlerin çoğunun çarptığı HNQ) vardır.
Josh

2
Açgözlü olmayın. Zaten yeterince görüş ve oyların var
Casanova

@JoshPetrie haklısın üzgünüm bu durumu tekrarlamıyorum. Utanıyorum, bu yüzden sorumu itibardan geri çekmeden özelliklerinden kaldırabilirim.
Seyed Morteza Kamali

Yanıtlar:


101

Piramit Parçacık

Birlik varsayılan parçacığın şekli dörtlüdür. öncelikle bu şekli piramit nesnesi kullanarak piramit şeklinde değiştirmelisiniz veya dörtlü bir geometri gölgelendiricili piramitlere çevirmelisiniz .

görüntü

awd

Refraksiyon

Kırık cam efekti ( Kırılma ) yapmak için GrabPass { "TextureName" }ekran içeriğini bir dokuya yerleştirecek olanı kullanabilirsiniz.

GrabPass özel bir geçiş türüdür - nesnenin bir dokuya çekilmek üzere olduğu ekranın içeriğini alır. Bu doku, gelişmiş görüntüye dayalı efektler yapmak için sonraki geçişlerde kullanılabilir.

https://docs.unity3d.com/Manual/SL-GrabPass.html

record_2018_02_03_23_09_06_370

Shader "Smkgames/GlassRefraction"
{
    Properties{
        _Refraction("Refraction",Float) = 0.05
        _Alpha("Alpha",Range(0,1)) = 1
    }
    SubShader
    {
Tags {"Queue"="Transparent" "RenderType"="Transparent"}

        Blend SrcAlpha OneMinusSrcAlpha

        GrabPass
        {
            "_GrabTexture"
        }

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
            };

            struct v2f
            {
                float4 grabPos : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };
            sampler2D _MainTex;
            float _Alpha,_Refraction;

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.grabPos = ComputeGrabScreenPos(o.vertex);
                return o;
            }

            sampler2D _GrabTexture;

            fixed4 frag (v2f i) : SV_Target
            {
                fixed4 col = tex2Dproj(_GrabTexture, i.grabPos+_Refraction);
                return float4(col.rgb,_Alpha);

            }
            ENDCG
        }
    }
}

Kafes normallerinin kullanılması

Dünyada mesh normları gösteren bir gölgelendirici ile devam edelim . Kullandım çünkü üç boyutlu kırık şekle bakmak istedim.

normaller

record_2018_02_05_18_06_09_41

record_2018_02_03_23_19_06_705

    Shader "Smkgames/BrokenGlass3D"
{
    Properties{
        _MainTex("MainTex",2D) = "white"{}
        _Alpha("Alpha",Float) = 1
    }
    SubShader
    {
Tags {"Queue"="Transparent" "RenderType"="Transparent"}
 Blend SrcAlpha OneMinusSrcAlpha 


        GrabPass
        {
            "_GrabTexture"
        }

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 grabPos : TEXCOORD0;
                float3 normal :NORMAL;
            };

            struct v2f
            {
                float4 grabPos : TEXCOORD0;
                float4 vertex : SV_POSITION;
                half3 worldNormal :TEXCOORD1;

            };
            sampler2D _MainTex;
            float _Intensity,_Alpha;

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.grabPos = ComputeGrabScreenPos(o.vertex);
                o.worldNormal = UnityObjectToWorldNormal(v.normal);
                return o;
            }

            sampler2D _GrabTexture;

            fixed4 frag (v2f i) : SV_Target
            {
                fixed4 c = 0;
                c.rgb = i.worldNormal*0.5+0.5;
                float4 distortion = tex2D(_MainTex,i.grabPos)+_Intensity;
                fixed4 col = tex2Dproj(_GrabTexture, i.grabPos+c.r);
                return float4(col.rgb,_Alpha);
            }
            ENDCG
        }
    }
}

Isı bozulma

Isı bozulmasını oluşturmak için akış haritasını kullanabilirsiniz

Bir akış haritası, bir dokuda 2d yön bilgisini depolayan bir dokudur. Pikselin rengi, uv koordinatlarını dokuyu temel olarak kullanmanın hangi yönünü belirlediğini belirler. Ne kadar fazla renk varsa orantılı hız o kadar hızlıdır. Örnek yeşil, yukarı sola gitmesini, merkezin nötr olduğunu ve kırmızıın aşağıya doğru ineceğini söyler. Su gibi sıvı malzemeler için kullanışlı bir teknik ve sadece bir panner düğümüne faydalı bir alternatif.

flow_map

heatdistortion

    Shader "Smkgames/HeatDistortion"
{
    Properties{
        _DistortionMap("DistortionMap",2D) = "white"{}
        _Intensity("Intensity",Float) = 50
        _Mask("Mask",2D) = "white"{}
        _Alpha("Alpha",Range(0,1)) = 1
    }
    SubShader
    {
Tags {"Queue"="Transparent" "RenderType"="Transparent"}

        GrabPass
        {
            "_GrabTexture"
        }

        Blend SrcAlpha OneMinusSrcAlpha

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
            };

            struct v2f
            {
                float4 grabPos : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };
            sampler2D _Mask,_DistortionMap;
            float _Alpha,_Refraction;

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.grabPos = ComputeGrabScreenPos(o.vertex);
                return o;
            }

            sampler2D _GrabTexture;
            float _Intensity;

            fixed4 frag (v2f i) : SV_Target
            {
                float mask = tex2D(_Mask,i.grabPos);
                mask = step(mask,0.5);
                //mask = smoothstep(mask,0,0.4);
                float4 distortion = tex2D(_DistortionMap,i.grabPos+_Time.y)+_Intensity;
                fixed4 col = tex2Dproj(_GrabTexture, i.grabPos*distortion);
                return float4(col.rgb,mask*_Alpha);

            }
            ENDCG
        }
    }
}

normal kullanarak başka bir örnek:

kesmek

normalmap

smoketile_normal 1

Shader "Smkgames/HeatDistortion2" {
Properties {
        _CutOut ("CutOut (A)", 2D) = "black" {}
        _BumpMap ("Normalmap", 2D) = "bump" {}
        _BumpAmt ("Distortion", Float) = 10
}

Category {

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

    SubShader {
        GrabPass {                          
            "_GrabTexture"
        }
        Pass {

CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
#pragma multi_compile_particles
#include "UnityCG.cginc"

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

struct v2f {
    float4 vertex : POSITION;
    float4 uvgrab : TEXCOORD0;
    float2 uvbump : TEXCOORD1;
    float2 uvcutout : TEXCOORD2;
};

sampler2D _BumpMap,_CutOut,_GrabTexture;
float _BumpAmt;
float4 _GrabTexture_TexelSize;
float4 _BumpMap_ST,_CutOut_ST;

v2f vert (appdata_t v)
{
    v2f o;
    o.vertex = UnityObjectToClipPos(v.vertex);
    o.uvgrab.xy = (float2(o.vertex.x, o.vertex.y*-1) + o.vertex.w) * 0.5;
    o.uvgrab.zw = o.vertex.zw;
    o.uvbump = TRANSFORM_TEX( v.texcoord, _BumpMap );
    o.uvcutout = TRANSFORM_TEX( v.texcoord, _CutOut );
    return o;
}



half4 frag( v2f i ) : COLOR
{
    half2 bump = UnpackNormal(tex2D( _BumpMap, i.uvbump )).rg;
    float2 offset = bump * _BumpAmt * _GrabTexture_TexelSize.xy;
    i.uvgrab.xy = offset * i.uvgrab.z + i.uvgrab.xy;

    half4 col = tex2Dproj( _GrabTexture, UNITY_PROJ_COORD(i.uvgrab));
    fixed4 cut = tex2D(_CutOut, i.uvcutout);
    fixed4 emission = col;
    emission.a = (cut.a);
    return emission;
}
ENDCG
        }
    }

  }
}

RGB Böl

İlk gifinize dikkat ederseniz, çok az RGB ayrıldığını görebilirsiniz.

u_rgb_seperation_ar

Shader "Hidden/RgbSplit"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _NoiseTex1 ("Noise Texture A", 2D) = "white" {}
        _NoiseTex2 ("Noise Texture B", 2D) = "white" {}
    }
    SubShader
    {

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

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

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

            sampler2D _MainTex,_NoiseTex1,_NoiseTex2;
            float3 colorSplit(float2 uv, float2 s)
{
    float3 color;
    color.r = tex2D(_MainTex, uv - s).r;
    color.g = tex2D(_MainTex, uv    ).g;
    color.b = tex2D(_MainTex, uv + s).b;
    return color;
}

float2 interlace(float2 uv, float s)
{
    uv.x += s * (4.0 * frac((uv.y) / 2.0) - 1.0);
    return uv;
}

    fixed4 frag (v2f i) : SV_Target
    {

    float t = _Time.y;

    float s = tex2D(_NoiseTex1, float2(t * 0.2, 0.5)).r;

    i.uv = interlace(i.uv, s * 0.005);
    float r = tex2D(_NoiseTex2, float2(t, 0.0)).x;

    float3 color = colorSplit(i.uv, float2(s * 0.02, 0.0));

    return float4(color, 1.0);

            }
            ENDCG
        }
    }
}

kullanışlı bağlantılar

https://www.fxguide.com/featured/time-for-destruction-the-tech-of-quantum-break/

Github Üzerindeki Kaynak


47
Merak ediyorum, bunun gibi teknikleri paylaşmak için bir geliştirici blogu oluşturmayı düşündünüz mü? Böyle bir kaynağa abone olurdum. :)
DMGregory

7
Ben öneri ikinci! Yaklaşımınız her zaman yaratıcı, ayrıntılı ve anlaşılması kolay olduğu için web sitenizi yanıtlarınız için her gün izliyorum. Sağladığınız örnekler de çok yardımcı oluyor.
altskop

4
RGB ayrıştırma efekti ile ilgili olarak: Gözlük takarım ve her zaman gözle ekran mesafesine göre değişen renk sapmalarının neden olduğu doğal olarak ortaya çıkan benzer bir etki yaşarım. Aynı şekilde, 3B gözlüklerin bir şeyin ne kadar uzak olduğuna dair çeşitli ipuçları arasında bir uyumsuzluğa yol açtığı şekilde, etkiniz beynimin ekranın gözümden ne kadar uzak olduğunu tahmin etmek için yorumladığı bir ayrıntıya müdahale ediyor. Bulantı noktasına gelince son derece nahoş bir durum. Lütfen kullanmayı tercih ederseniz isteğe bağlı yapın!
Aoeuid

1
@ Aoeuid FWIW, düzeltici vizyonu olmayan insanlar için bile oldukça tatsız bir durum :) :)
Max

Evet @DMGregory: DI yok bir site ben burada benim tekniklerini paylaşmak Ben yararlı olacaktır bana destek gelişmekte blog veya site.If için desteğe ihtiyacı https://www.patreon.com/SeyedMortezaKamaly
Seyit Murtaza Kamali
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.