114 lines
3.3 KiB
Plaintext
114 lines
3.3 KiB
Plaintext
|
|
Shader "Projector/Caustics" {
|
||
|
|
Properties {
|
||
|
|
_Color ("Main Color", Color) = (1,1,1,1)
|
||
|
|
_CausticTex ("Cookie", 2D) = "" {}
|
||
|
|
[Toggle]
|
||
|
|
_Scroll("Enable Scrolling",float) = 0
|
||
|
|
_Speed("Caustic Speed",float) = 1
|
||
|
|
_Blending("Blending",Range(1,2)) = 2
|
||
|
|
_FalloffTex ("FallOff", 2D) = "" {}
|
||
|
|
[Header(Distortion)]
|
||
|
|
_DistortionTex("Distortion Texture",2D) = "black" {}
|
||
|
|
_Distortion ("Distortion",Range(0,1)) = 0.5
|
||
|
|
_DistortionSpeed("Distortion Speed",float) = 0.5
|
||
|
|
}
|
||
|
|
|
||
|
|
Subshader {
|
||
|
|
Tags {"Queue"="Transparent"}
|
||
|
|
Pass {
|
||
|
|
ZWrite Off
|
||
|
|
ColorMask RGB
|
||
|
|
Blend SrcAlpha One
|
||
|
|
Offset -1, -1
|
||
|
|
|
||
|
|
CGPROGRAM
|
||
|
|
#pragma vertex vert
|
||
|
|
#pragma fragment frag
|
||
|
|
#pragma multi_compile_fog
|
||
|
|
#pragma multi_compile _ _SCROLL_ON
|
||
|
|
#include "UnityCG.cginc"
|
||
|
|
|
||
|
|
struct v2f {
|
||
|
|
float4 pos : SV_POSITION;
|
||
|
|
|
||
|
|
float4 uvFalloff : TEXCOORD0;
|
||
|
|
float4 worldPos : TEXCOORD1;
|
||
|
|
float3 worldNormal : TEXCOORD2;
|
||
|
|
float4 xUV : TEXCOORD3;
|
||
|
|
float4 yUV : TEXCOORD4;
|
||
|
|
float4 zUV : TEXCOORD5;
|
||
|
|
};
|
||
|
|
|
||
|
|
float4x4 unity_Projector;
|
||
|
|
float4x4 unity_ProjectorClip;
|
||
|
|
float _Speed;
|
||
|
|
float _Blending;
|
||
|
|
float _Distortion;
|
||
|
|
float _DistortionSpeed;
|
||
|
|
|
||
|
|
half4 _CausticTex_ST;
|
||
|
|
half4 _DistortionTex_ST;
|
||
|
|
|
||
|
|
v2f vert (float4 vertex : POSITION, float3 normal : NORMAL)
|
||
|
|
{
|
||
|
|
v2f o;
|
||
|
|
o.pos = UnityObjectToClipPos (vertex);
|
||
|
|
o.uvFalloff = mul (unity_ProjectorClip, vertex);
|
||
|
|
o.worldPos = mul (unity_ObjectToWorld,vertex);
|
||
|
|
o.worldNormal = UnityObjectToWorldNormal(normal);
|
||
|
|
|
||
|
|
#if _SCROLL_ON
|
||
|
|
float time1 = frac(_Time.x * _Speed);
|
||
|
|
float time2 = frac(_Time.x * _DistortionSpeed);
|
||
|
|
#else
|
||
|
|
float time1 = 0;
|
||
|
|
float time2 = 0;
|
||
|
|
#endif
|
||
|
|
|
||
|
|
// Anim UV
|
||
|
|
o.xUV.xy = o.worldPos.zy * _CausticTex_ST.xy + time1;
|
||
|
|
o.xUV.zw = o.worldPos.zy * _DistortionTex_ST.xy - time2;
|
||
|
|
|
||
|
|
o.yUV.xy = o.worldPos.xz * _CausticTex_ST.xy + time1;
|
||
|
|
o.yUV.zw = o.worldPos.xz * _DistortionTex_ST.xy - time2;
|
||
|
|
|
||
|
|
o.zUV.xy = o.worldPos.xy * _CausticTex_ST.xy + time1;
|
||
|
|
o.zUV.zw = o.worldPos.xy * _DistortionTex_ST.xy - time2;
|
||
|
|
|
||
|
|
return o;
|
||
|
|
}
|
||
|
|
|
||
|
|
fixed4 _Color;
|
||
|
|
sampler2D _CausticTex;
|
||
|
|
sampler2D _FalloffTex;
|
||
|
|
sampler2D _DistortionTex;
|
||
|
|
|
||
|
|
fixed4 frag (v2f i) : SV_Target
|
||
|
|
{
|
||
|
|
fixed texF = tex2Dproj (_FalloffTex, UNITY_PROJ_COORD(i.uvFalloff)).a;
|
||
|
|
|
||
|
|
half3 blendWeights = smoothstep(0,_Blending,abs(i.worldNormal));
|
||
|
|
|
||
|
|
float2 offset = tex2D (_DistortionTex, i.xUV.zw).rg * blendWeights.x * _Distortion;
|
||
|
|
float2 offset2 = tex2D (_DistortionTex, i.yUV.zw).rg * blendWeights.y * _Distortion;
|
||
|
|
float2 offset3 = tex2D (_DistortionTex, i.zUV.zw).rg * blendWeights.z * _Distortion;
|
||
|
|
|
||
|
|
fixed tex = tex2D (_CausticTex, i.xUV.xy + offset * 0.5 + 0.5) * blendWeights.x;
|
||
|
|
fixed tex2 = tex2D (_CausticTex, i.yUV.xy + offset2 * 0.5 + 0.5)* blendWeights.y;
|
||
|
|
fixed tex3 = tex2D (_CausticTex, i.zUV.xy + offset3 * 0.5 + 0.5) * blendWeights.z;
|
||
|
|
|
||
|
|
// fixed tex = max(tex2D (_CausticTex, i.xUV.xy), tex2D (_CausticTex, i.xUV.zw)) * blendWeights.x;
|
||
|
|
// fixed tex2 = max(tex2D (_CausticTex, i.yUV.xy), tex2D (_CausticTex, i.yUV.zw)) * blendWeights.y;
|
||
|
|
// fixed tex3 = max(tex2D (_CausticTex, i.zUV.xy), tex2D (_CausticTex, i.zUV.zw)) * blendWeights.z;
|
||
|
|
|
||
|
|
fixed res = tex + tex2 + tex3;
|
||
|
|
|
||
|
|
|
||
|
|
//return fixed4(blendWeights,1);
|
||
|
|
return 2.0 * fixed4(_Color.rgb,saturate(res) * _Color.a * texF);
|
||
|
|
}
|
||
|
|
ENDCG
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|