Как я могу реплицировать эффект частицы квантованного разрыва?
Квантовый разрыв обладает этим фантастическим эффектом частиц, это эффект искажения, например, битое стекло. Я хочу знать, как я могу воспроизвести этот эффект? Вы можете видеть это ниже, и полное видео доступно на YouTube :
1 ответ
Пирамидальная деталь
Форма частицы частицы Unity равна квадрату. сначала вам нужно изменить эту форму на пирамиду с помощью объекта пирамиды или превращается квадранты к пирамидам с геометрическим шейдером .
Преломление
Чтобы создать эффект разбитого стекла ( Преломление ), вы можете использовать
GrabPass {"TextureName"}
, который захватит содержимое экрана в текстуре.
GrabPass - это специальный тип прохода - он захватывает содержимое экрана, на котором объект собирается вставить в текстуру. Эта текстура может использоваться в последующих проходах для выполнения расширенных эффектов на основе изображений.
Шейдер "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
}
}
}
Использование нормалей сетки
Давайте продолжим с шейдером, который отобразит сетчатые нормали в мире пространство. Я использовал его, потому что я хотел посмотреть трехмерную сломанную форму.
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.
Шейдер "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
}
}
}
другой пример, используя обычный:
Шейдер "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 /признаки /время для уничтожения, заместитель текли из-квантового-брейка /