FXTrigField

Description
A shader that produces a force field effect using trigonometric functions.

Usage
Color adjusts the field color. Rate adjusts the rate at which the field moves. Scale adjusts the granularity of detail seen in the field. This shader has two configuration defines:

#define USE_TAN
Default. When this symbol is defined, the field has more defined patterns and will over-saturate the colors, yielding more of an energy effect. When this symbol is not defined (i.e., #undef USE_TAN), the field is generally amorphous in appearance.

#define USE_LINES
Disabled by default. When this symbol is defined, any patterns appear linear rather than curved. By default this symbol is not defined (i.e., #undef USE_LINES).

// // Shader: "FX/TrigField" // Version: v1.0 // Written by: Thomas Phillips // // Anyone is free to use this shader for non-commercial or commercial projects. // // Description: // Generic force field effect. // Play with color, opacity, and rate for different effects. //

Shader "FX/TrigField" {

Properties { _Color ("Color Tint", Color) = (0, 0, 0.5, 1.0) _Rate ("Oscillation Rate", Range (1, 10)) = 1.0 _Scale ("Ripple Scale", Range (1, 30)) = 10.0 }

SubShader { ZWrite Off Tags { "Queue" = "Transparent" } Blend One One

Pass {

CGPROGRAM

// Define/undefine either/both of these for a differnt variant.
 * 1) define USE_TAN
 * 2) undef USE_LINES


 * 1) pragma vertex vert
 * 2) pragma fragment frag
 * 3) pragma fragmentoption ARB_fog_exp2
 * 4) include "UnityCG.cginc"

float4 _Color; float _Rate; float _Scale;

struct v2f { V2F_POS_FOG; float4 texcoord : TEXCOORD0; float4[4] target : TEXCOORD1; };

v2f vert (appdata_base v) { v2f o;	PositionFog( v.vertex, o.pos, o.fog ); o.texcoord = v.texcoord; int j;	for ( j = 2; j < 5; j++) { float a, b;		sincos(j*_Time[0], a, b); o.target[j-2] = float4(a, b, 0, 0); }	return o; }

half4 frag (v2f i) : COLOR {	float4 d;	int j;	float r = _Time[1] * _Rate; for ( j = 0; j < 3; j++) { d[j] = tan(_Scale * dot(i.texcoord, i.target[j]) - r); d[j] = sin(_Scale * dot(i.texcoord, i.target[j]) - r) * 3; d[j] = tan(_Scale * distance(i.texcoord, i.target[j]) - r); d[j] = sin(_Scale * distance(i.texcoord, i.target[j]) - r) * 3; } // for return half4( (dot(d, d) * _Color).xyz, 1 ); } ENDCG
 * 1) ifdef USE_LINES
 * 2) ifdef USE_TAN
 * 1) else
 * 1) endif
 * 2) else
 * 3) ifdef USE_TAN
 * 1) else
 * 1) endif
 * 2) endif

} } Fallback "Transparent/Diffuse" }