CalmWater_Foam.cginc 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. #ifndef CALMWATER_FOAM_INCLUDED
  2. #define CALMWATER_FOAM_INCLUDED
  3. void ComputeFoam(inout GlobalData data, v2f IN)
  4. {
  5. #if _FOAM_ON || _WHITECAPS_ON
  6. #ifndef SHADER_API_D3D9
  7. float2 foamUV = IN.FoamUV.xy;
  8. #else
  9. float2 foamUV = IN.worldPos.xz;
  10. #endif
  11. fixed foamMask = 0;
  12. //Foam Texture with animation
  13. fixed3 foamTex = tex2D(_FoamTex, foamUV + (data.tangentNormal.xy * 0.05)).r;
  14. // ===========================================================================
  15. // FOAM
  16. // ===========================================================================
  17. #if _FOAM_ON
  18. //Border Foam Mask
  19. foamMask = 1.0 - saturate(_FoamSize * (data.cleanDepth - data.DepthUV.z));
  20. #endif
  21. // ===========================================================================
  22. // WHITE CAPS
  23. // ===========================================================================
  24. #if _WHITECAPS_ON
  25. #ifndef SHADER_API_D3D9
  26. float2 maskUV = IN.FoamUV.zw;
  27. #else
  28. float2 maskUV = IN.worldPos.xz;
  29. #endif
  30. fixed capsMask = tex2D(_CapsMask, maskUV);
  31. #if _DISPLACEMENTMODE_WAVE || _DISPLACEMENTMODE_GERSTNER || _DISPLACEMENTMODE_TEXTURE
  32. capsMask *= IN.ambient.a;
  33. #endif
  34. capsMask = smoothstep(0, _CapsSize, capsMask);
  35. foamMask = max(_CapsIntensity * capsMask, foamMask);
  36. #endif
  37. foamTex *= foamMask.xxx * _FoamColor.rgb * max(_LightColor0.rgb, IN.ambient.rgb);
  38. data.finalColor += min(1.0, 2.0 * foamTex);
  39. #endif
  40. }
  41. #endif