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