// Stylized Water 3 by Staggart Creations (http://staggart.xyz) // COPYRIGHT PROTECTED UNDER THE UNITY ASSET STORE EULA (https://unity.com/legal/as-terms) // • Copying or referencing source code for the production of new asset store, or public, content is strictly prohibited! // • Uploading this file to a public repository will subject it to an automated DMCA takedown request. #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" //SRGBToLinear #include "Common.hlsl" //Set through SetupConstants pass bool _CausticsProjectionAvailable; float4x4 CausticsProjection; TEXTURE2D(_CausticsTex); SAMPLER(sampler_CausticsTex); float2 CalculateTriPlanarProjection(in float3 positionWS, in float3 normalWS) { float3 faceNormal = round(abs(normalWS)); float2 compA = lerp(positionWS.yz, positionWS.xz, faceNormal.y); float2 compB = lerp(compA, positionWS.xy, faceNormal.z); return compB; } void CalculateTriPlanarProjection_float(in float3 positionWS, in float3 normalWS, out float2 uv) { uv = CalculateTriPlanarProjection(positionWS, normalWS); } //Normal is expected to be that of the geometry not the water surface float2 GetCausticsProjection(in float4 positionCS, in float3 lightDir, float3 positionWS, float3 sceneWorldNormal, bool directional, inout half attenuation) { //return CalculateTriPlanarProjection(positionWS, sceneWorldNormal); #if !_DISABLE_DEPTH_TEX if(directional && _CausticsProjectionAvailable) { const half NdotL = saturate(dot(sceneWorldNormal, lightDir)); attenuation *= NdotL; //CausticsProjection matrix set up through scripting return mul(CausticsProjection, float4(positionWS, 1.0)).xy; } #endif return positionWS.xz; } float3 SampleCaustics(float2 uv, float2 time, float tiling, float chromance) { float3 caustics = 0; float2 coords = uv * tiling; float2 uv1 = coords + (time.xy); #if defined(CAUSTICS_SINGLE_LAYER) caustics = SAMPLE_TEXTURE2D(_CausticsTex, sampler_CausticsTex, uv1).rgb; #else float2 uv2 = coords * 0.6 - time.xy; float3 caustics1 = SAMPLE_TEXTURE2D_LOD(_CausticsTex, sampler_CausticsTex, uv1, 0).rgb; float3 caustics2 = SAMPLE_TEXTURE2D_LOD(_CausticsTex, sampler_CausticsTex, uv2, 0).rgb; #if UNITY_COLORSPACE_GAMMA caustics1 = SRGBToLinear(caustics1); caustics2 = SRGBToLinear(caustics2); #endif caustics = min(caustics1, caustics2) * 2.0; #endif return lerp(caustics.rrr, caustics.rgb, chromance); }