ArabDesert/Assets/ReimajoBoothAssets/AdminTool/Explosion/ien-refraction-refraction-r...

73 lines
2.6 KiB
Plaintext

Shader "Ien/Refraction/Refraction-Ring ViewSpaceNormals NoSurface"
{
Properties
{
_IndxOfRefract ("Index of Refraction", Range(-1.0,1.0)) = 0.1
_Expansion ("Expansion", Range(0.0, 1.0)) = 1
_Width ("Width", Range(-1.0, 1.0)) = -0.075
}
SubShader
{
Tags { "RenderType"="Transparent" "Queue"="Transparent" "ForceNoShadowCasting" = "True"}
LOD 100
GrabPass{}
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
// builtin variable to get Grabbed Texture if GrabPass has no name
sampler2D _GrabTexture;
half _IndxOfRefract;
half _Expansion;
half _Width;
struct v2f
{
float4 vertex : SV_POSITION;
float4 screenUV : TEXCOORD0;
float3 viewNormal : TEXCOORD1;
float4 worldPos : TEXCOORD2;
};
v2f vert(appdata_base v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.screenUV = ComputeGrabScreenPos(o.vertex);
// transform normal vectors from model space to world space
float3 worldNorm =
normalize(
unity_WorldToObject[0].xyz * v.normal.x +
unity_WorldToObject[1].xyz * v.normal.y +
unity_WorldToObject[2].xyz * v.normal.z
);
o.worldPos = mul(unity_ObjectToWorld, v.vertex);
o.viewNormal = mul((float3x3)UNITY_MATRIX_V, worldNorm);
return o;
}
float4 frag(v2f i) : SV_TARGET
{
float3 viewDirection = normalize(_WorldSpaceCameraPos.xyz - i.worldPos.xyz);
float3 NormalBlendDetail = i.viewNormal.rgb * float3(-1, -1, 1);
float3 NormalBlendBase = (mul(UNITY_MATRIX_V, float4(viewDirection, 0)).rgb*float3(-1, -1, 1)) + float3(0, 0, 1);
float3 noSknewViewNormal = NormalBlendBase * dot(NormalBlendBase, NormalBlendDetail) / NormalBlendBase.b - NormalBlendDetail;
float distortStrength = clamp((length(noSknewViewNormal.xy) - _Expansion) * (1/_Width), 0, 1);
distortStrength = sin(distortStrength*3.14159265)*_IndxOfRefract;
return tex2Dproj(_GrabTexture, i.screenUV + float4(distortStrength*noSknewViewNormal.x, distortStrength*noSknewViewNormal.y, 0, 0));
}
ENDCG
}
}
}