Как я могу реплицировать эффект частицы квантованного разрыва?

Квантовый разрыв обладает этим фантастическим эффектом частиц, это эффект искажения, например, битое стекло. Я хочу знать, как я могу воспроизвести этот эффект? Вы можете видеть это ниже, и полное видео доступно на YouTube :

record_2018_02_05_16_34_26_307

record_2018_02_01_22_27_44_971

67 голосов | спросил Seyed Morteza Kamali 5 FebruaryEurope/MoscowbMon, 05 Feb 2018 19:48:45 +0300000000pmMon, 05 Feb 2018 19:48:45 +030018 2018, 19:48:45

1 ответ


100

Пирамидальная деталь

Форма частицы частицы Unity равна квадрату. сначала вам нужно изменить эту форму на пирамиду с помощью объекта пирамиды или превращается квадранты к пирамидам с геометрическим шейдером .

image

awd

Преломление

Чтобы создать эффект разбитого стекла ( Преломление ), вы можете использовать GrabPass {"TextureName"}, который захватит содержимое экрана в текстуре.

  

GrabPass - это специальный тип прохода - он захватывает содержимое экрана, на котором объект собирается вставить в текстуру. Эта текстура может использоваться в последующих проходах для выполнения расширенных эффектов на основе изображений.

     

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

record_2018_02_03_23_09_06_370

Шейдер "Smkgames /GlassRefraction"
{
    Свойства {
        _Рефракция («Преломление», Поплавок) = 0,05
        _Alpha («Alpha», Range (0,1)) = 1
    }
    SubShader
    {
Теги {"Queue" = "Transparent" "RenderType" = "Transparent"}

        Blend SrcAlpha OneMinusSrcAlpha

        GrabPass
        {
            "_GrabTexture"
        }

        Проходить
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma фрагмент фрагмент

            #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
        }
    }
}

Использование нормалей сетки

Давайте продолжим с шейдером, который отобразит сетчатые нормали в мире пространство. Я использовал его, потому что я хотел посмотреть трехмерную сломанную форму.

normals

record_2018_02_05_18_06_09_41

record_2018_02_03_23_19_06_705

Shader "Smkgames /BrokenGlass3D"
{
    Свойства {
        _MainTex («MainTex», 2D) = «белый» {}
        _Alpha («Alpha», Float) = 1
    }
    SubShader
    {
Теги {"Queue" = "Transparent" "RenderType" = "Transparent"}
 Blend SrcAlpha OneMinusSrcAlpha


        GrabPass
        {
            "_GrabTexture"
        }

        Проходить
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma фрагмент фрагмент

            #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) + _ Интенсивность;
                fixed4 col = tex2Dproj (_GrabTexture, i.grabPos + c.r);
                return float4 (col.rgb, _Alpha);
            }
            ENDCG
        }}
}

Тепловое искажение

Чтобы создать тепловое искажение, вы можете использовать карту потока

  

Карта потока - это текстура, которая хранит 2d направленную информацию в текстуре. Цвет пикселя определяет, в каком направлении он использует текстуру uv-координат в качестве базы. Чем больше цвета, тем быстрее пропорциональная скорость. Пример green говорит, что он идет вверх-влево, центр нейтрален, а красный - вниз. Itâ € ™ s полезный метод для жидких материалов, таких как вода, и полезная альтернатива только узлу panner.

flow_map

heatdistortion

Шейдер "Smkgames /HeatDistortion"
{
    Свойства {
        _DistortionMap («DistortionMap», 2D) = «белый» {}
        _Intensity («Интенсивность», Float) = 50
        _Mask («Маска», 2D) = «белый» {}
        _Alpha («Alpha», Range (0,1)) = 1
    }
    SubShader
    {
Теги {"Queue" = "Transparent" "RenderType" = "Transparent"}

        GrabPass
        {
            "_GrabTexture"
        }

        Blend SrcAlpha OneMinusSrcAlpha

        Проходить
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma фрагмент фрагмент

            #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 (маска, 0.5);
                //mask = smoothstep (маска, 0,0.4);
                float4 distortion = tex2D (_DistortionMap, i.grabPos + _Time.y) + _ Интенсивность;
                fixed4 col = tex2Dproj (_GrabTexture, i.grabPos * искажение);
                return float4 (col.rgb, mask * _Alpha);

            }
            ENDCG
        }
    }
}

другой пример, используя обычный:

cutout

normalmap

smoketile_normal 1

Шейдер "Smkgames /HeatDistortion2" {
Свойства {
        _CutOut («CutOut (A)», 2D) = «черный» {}
        _BumpMap ("Normalmap", 2D) = "bump" {}
        _BumpAmt («Искажение», «Поплавок») = 10
}

Категория {

    Теги {"Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Opaque"}
    Blend SrcAlpha OneMinusSrcAlpha
    Cull Off
    Освещение
    ZWrite Off
    Fog {Mode Off}

    SubShader {
        GrabPass {
            "_GrabTexture"
        }
        Проходить {

CGPROGRAM
#pragma vertex vert
#pragma фрагмент фрагмент
#pragma фрагментация 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): ЦВЕТ
{
    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 эмиссия = col;
    эмиссия.a = (cut.a);
    обратная эмиссия;
}
ENDCG
        }
    }

  }
}

Разделение RGB

Если вы обратите внимание на свой первый gif, вы можете увидеть небольшое разделение RGB.

Shader "Hidden /RgbSplit"
{
    свойства
    {
        _MainTex («Текстура», 2D) = «белый» {}
        _NoiseTex1 («Шумовая текстура A», 2D) = «белый» {}
        _NoiseTex2 («Текстура шума B», 2D) = «белый» {}
    }
    SubShader
    {

        Проходить
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma фрагмент фрагмент

            #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;
    цвет возврата;
}

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 = чередование (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 (цвет, 1.0);

            }
            ENDCG
        }
    }
}

Полезные ссылки

https: //www.fxguide .com /признаки /время для уничтожения, заместитель текли из-квантового-брейка /

Источник на Github

ответил Seyed Morteza Kamali 5 FebruaryEurope/MoscowbMon, 05 Feb 2018 19:49:05 +0300000000pmMon, 05 Feb 2018 19:49:05 +030018 2018, 19:49:05

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132