internal static void SetGlobalSkyParameters(Gradient skyGradient, float skyAtmosphereMie, float skyMieMultiplier, float skyRayleighMultiplier, float skyAtmosphereThickness, float skyAtmosphereTurbidity, float skyExposure, Color skyTintColor, float skyOuterRadius, float skyInnerRadius, float skyCameraHeight, Vector4 waveLength) { // global sky parameters float mieG = -skyAtmosphereMie; float mieG2 = skyAtmosphereMie * skyAtmosphereMie; float mieConstant = 0.001f * skyMieMultiplier; float rayleighConstant = 0.0025f * skyRayleighMultiplier; rayleighConstant = Mathf.LerpUnclamped(0.0f, rayleighConstant, Mathf.Pow(skyAtmosphereThickness, 2.5f)); float redColor = waveLength.x; float greenColor = waveLength.y; float blueColor = waveLength.z; float lightRange = waveLength.w; float lightWaveLengthRedTint = Mathf.Lerp(redColor - lightRange, redColor + lightRange, 1.0f - skyTintColor.r); float lightWaveLengthGreenTint = Mathf.Lerp(greenColor - lightRange, greenColor + lightRange, 1.0f - skyTintColor.g); float lightWaveLengthBlueTint = Mathf.Lerp(blueColor - lightRange, blueColor + lightRange, 1.0f - skyTintColor.b); float lightWaveLengthRed4 = lightWaveLengthRedTint * lightWaveLengthRedTint * lightWaveLengthRedTint * lightWaveLengthRedTint; float lightWaveLengthGreen4 = lightWaveLengthGreenTint * lightWaveLengthGreenTint * lightWaveLengthGreenTint * lightWaveLengthGreenTint; float lightWaveLengthBlue4 = lightWaveLengthBlueTint * lightWaveLengthBlueTint * lightWaveLengthBlueTint * lightWaveLengthBlueTint; float lightInverseWaveLengthRed4 = 1.0f / lightWaveLengthRed4; float lightInverseWaveLengthGreen4 = 1.0f / lightWaveLengthGreen4; float lightInverseWaveLengthBlue4 = 1.0f / lightWaveLengthBlue4; const float sunBrightnessFactor = 40.0f; float sunRed = rayleighConstant * sunBrightnessFactor * lightInverseWaveLengthRed4; float sunGreen = rayleighConstant * sunBrightnessFactor * lightInverseWaveLengthGreen4; float sunBlue = rayleighConstant * sunBrightnessFactor * lightInverseWaveLengthBlue4; float sunIntensity = mieConstant * sunBrightnessFactor; float pi4Red = rayleighConstant * 4.0f * skyAtmosphereTurbidity * Mathf.PI * lightInverseWaveLengthRed4; float pi4Green = rayleighConstant * 4.0f * skyAtmosphereTurbidity * Mathf.PI * lightInverseWaveLengthGreen4; float pi4Blue = rayleighConstant * 4.0f * skyAtmosphereTurbidity * Mathf.PI * lightInverseWaveLengthBlue4; float pi4Intensity = mieConstant * 4.0f * skyAtmosphereTurbidity * Mathf.PI; float scaleFactor = 1.0f / (skyOuterRadius - 1.0f); const float scaleDepth = 0.25f; float scaleOverScaleDepth = scaleFactor / scaleDepth; Vector4 col = WeatherMakerScript.EvaluateSunGradient(skyGradient); col.w = skyExposure; Shader.SetGlobalVector("_WeatherMakerSkyGradientColor", col); Shader.SetGlobalFloat("_WeatherMakerSkySamples", 3.0f); float mieDot = Mathf.Pow(1.0f - Vector3.Dot(Vector3.up, -WeatherMakerScript.Instance.Sun.Transform.forward), 5.0f); Shader.SetGlobalVector("_WeatherMakerSkyMieG", new Vector4(mieG, mieG2, -mieG, mieDot)); Shader.SetGlobalVector("_WeatherMakerSkyAtmosphereParams", new Vector4(skyAtmosphereThickness, skyAtmosphereTurbidity, skyExposure, 0.0f)); Shader.SetGlobalVector("_WeatherMakerSkyRadius", new Vector4(skyOuterRadius, skyOuterRadius * skyOuterRadius, skyInnerRadius, skyInnerRadius * skyInnerRadius)); Shader.SetGlobalVector("_WeatherMakerSkyMie", new Vector4(1.5f * ((1.0f - mieG2) / (2.0f + mieG2)), 1.0f + mieG2, 2.0f + mieG, 0.0f)); Shader.SetGlobalVector("_WeatherMakerSkyLightScattering", new Vector4(sunRed, sunGreen, sunBlue, sunIntensity)); Shader.SetGlobalVector("_WeatherMakerSkyLightPIScattering", new Vector4(pi4Red, pi4Green, pi4Blue, pi4Intensity)); Shader.SetGlobalVector("_WeatherMakerSkyScale", new Vector4(scaleFactor, scaleDepth, scaleOverScaleDepth, skyCameraHeight)); // reduce wave length for preetham sky formulas waveLength *= 1E-6f; Shader.SetGlobalVector("_WeatherMakerSkyTotalRayleigh", GetTotalRayleigh(waveLength, skyRayleighMultiplier * skyAtmosphereThickness)); Shader.SetGlobalVector("_WeatherMakerSkyTotalMie", GetTotalMie(waveLength, skyAtmosphereTurbidity, skyMieMultiplier)); }
public void SetShaderCloudParameters(Material m) { m.DisableKeyword("ENABLE_CLOUDS"); m.DisableKeyword("ENABLE_CLOUDS_MASK"); if (CloudsEnabled) { m.SetTexture("_CloudNoise1", CloudLayer1.CloudNoise ?? Texture2D.blackTexture); m.SetTexture("_CloudNoise2", CloudLayer2.CloudNoise ?? Texture2D.blackTexture); m.SetTexture("_CloudNoise3", CloudLayer3.CloudNoise ?? Texture2D.blackTexture); m.SetTexture("_CloudNoise4", CloudLayer4.CloudNoise ?? Texture2D.blackTexture); //WeatherMakerShaderIds.SetFloatArray(m, "_CloudSampleCount", (float)CloudSampleCount, (float)CloudSampleCount2, (float)CloudSampleCount3, (float)CloudSampleCount4); //WeatherMakerShaderIds.SetVectorArray(m, "_CloudSampleStepMultiplier", CloudSampleStepMultiplier, CloudSampleStepMultiplier2, CloudSampleStepMultiplier3, CloudSampleStepMultiplier4); //WeatherMakerShaderIds.SetFloatArray(m, "_CloudSampleCount", CloudSampleCount, CloudSampleCount2, CloudSampleCount3, CloudSampleCount4); //WeatherMakerShaderIds.SetVectorArray(m, "_CloudSampleDitherMagic", CloudSampleDitherMagic, CloudSampleDitherMagic2, CloudSampleDitherMagic3, CloudSampleDitherMagic4); //WeatherMakerShaderIds.SetFloatArray(m, "_CloudSampleDitherIntensity", CloudSampleDitherIntensity.x, CloudSampleDitherIntensity.y, CloudSampleDitherIntensity.z, CloudSampleDitherIntensity.w); WeatherMakerShaderIds.SetColorArray(m, "_CloudColor", CloudLayer1.CloudColor * WeatherMakerScript.EvaluateSunGradient(CloudLayer1.CloudGradientColor), CloudLayer2.CloudColor * WeatherMakerScript.EvaluateSunGradient(CloudLayer2.CloudGradientColor), CloudLayer3.CloudColor * WeatherMakerScript.EvaluateSunGradient(CloudLayer3.CloudGradientColor), CloudLayer4.CloudColor * WeatherMakerScript.EvaluateSunGradient(CloudLayer4.CloudGradientColor)); WeatherMakerShaderIds.SetColorArray(m, "_CloudEmissionColor", CloudLayer1.CloudEmissionColor, CloudLayer2.CloudEmissionColor, CloudLayer3.CloudEmissionColor, CloudLayer4.CloudEmissionColor); WeatherMakerShaderIds.SetFloatArray(m, "_CloudAmbientMultiplier", CloudLayer1.CloudAmbientMultiplier, CloudLayer2.CloudAmbientMultiplier, CloudLayer3.CloudAmbientMultiplier, CloudLayer4.CloudAmbientMultiplier); WeatherMakerShaderIds.SetVectorArray(m, "_CloudNoiseScale", CloudLayer1.CloudNoiseScale * scaleReducer, CloudLayer2.CloudNoiseScale * scaleReducer, CloudLayer3.CloudNoiseScale * scaleReducer, CloudLayer4.CloudNoiseScale * scaleReducer); WeatherMakerShaderIds.SetVectorArray(m, "_CloudNoiseMultiplier", CloudLayer1.CloudNoiseMultiplier, CloudLayer2.CloudNoiseMultiplier, CloudLayer3.CloudNoiseMultiplier, CloudLayer4.CloudNoiseMultiplier); float velMult = Time.deltaTime * 0.005f; WeatherMakerShaderIds.SetVectorArray(m, "_CloudNoiseVelocity", (cloudNoiseVelocityAccum1 += (CloudLayer1.CloudNoiseVelocity * velMult)), (cloudNoiseVelocityAccum2 += (CloudLayer2.CloudNoiseVelocity * velMult)), (cloudNoiseVelocityAccum3 += (CloudLayer3.CloudNoiseVelocity * velMult)), (cloudNoiseVelocityAccum4 += (CloudLayer4.CloudNoiseVelocity * velMult))); WeatherMakerShaderIds.SetFloatArrayRotation(m, "_CloudNoiseRotation", CloudLayer1.CloudNoiseRotation.LastValue, CloudLayer2.CloudNoiseRotation.LastValue, CloudLayer3.CloudNoiseRotation.LastValue, CloudLayer4.CloudNoiseRotation.LastValue); if (CloudLayer1.CloudNoiseMask == null && CloudLayer2.CloudNoiseMask == null && CloudLayer3.CloudNoiseMask == null && CloudLayer4.CloudNoiseMask == null) { m.EnableKeyword("ENABLE_CLOUDS"); } else { m.EnableKeyword("ENABLE_CLOUDS_MASK"); m.SetTexture("_CloudNoiseMask1", CloudLayer1.CloudNoiseMask ?? Texture2D.whiteTexture); m.SetTexture("_CloudNoiseMask2", CloudLayer2.CloudNoiseMask ?? Texture2D.whiteTexture); m.SetTexture("_CloudNoiseMask3", CloudLayer3.CloudNoiseMask ?? Texture2D.whiteTexture); m.SetTexture("_CloudNoiseMask4", CloudLayer4.CloudNoiseMask ?? Texture2D.whiteTexture); WeatherMakerShaderIds.SetVectorArray(m, "_CloudNoiseMaskOffset", CloudLayer1.CloudNoiseMaskOffset, CloudLayer2.CloudNoiseMaskOffset, CloudLayer3.CloudNoiseMaskOffset, CloudLayer4.CloudNoiseMaskOffset); WeatherMakerShaderIds.SetVectorArray(m, "_CloudNoiseMaskVelocity", (cloudNoiseMaskVelocityAccum1 += (CloudLayer1.CloudNoiseMaskVelocity * velMult)), (cloudNoiseMaskVelocityAccum2 += (CloudLayer2.CloudNoiseMaskVelocity * velMult)), (cloudNoiseMaskVelocityAccum3 += (CloudLayer3.CloudNoiseMaskVelocity * velMult)), (cloudNoiseMaskVelocityAccum4 += (CloudLayer4.CloudNoiseMaskVelocity * velMult))); WeatherMakerShaderIds.SetFloatArray(m, "_CloudNoiseMaskScale", CloudLayer1.CloudNoiseMaskScale * scaleReducer, CloudLayer2.CloudNoiseMaskScale * scaleReducer, CloudLayer3.CloudNoiseMaskScale * scaleReducer, CloudLayer4.CloudNoiseMaskScale * scaleReducer); WeatherMakerShaderIds.SetFloatArrayRotation(m, "_CloudNoiseMaskRotation", CloudLayer1.CloudNoiseMaskRotation.LastValue, CloudLayer2.CloudNoiseMaskRotation.LastValue, CloudLayer3.CloudNoiseMaskRotation.LastValue, CloudLayer4.CloudNoiseMaskRotation.LastValue); } WeatherMakerShaderIds.SetFloatArray(m, "_CloudHeight", CloudLayer1.CloudHeight, CloudLayer2.CloudHeight, CloudLayer3.CloudHeight, CloudLayer4.CloudHeight); WeatherMakerShaderIds.SetFloatArray(m, "_CloudCover", CloudLayer1.CloudCover, CloudLayer2.CloudCover, CloudLayer3.CloudCover, CloudLayer4.CloudCover); WeatherMakerShaderIds.SetFloatArray(m, "_CloudDensity", CloudLayer1.CloudDensity, CloudLayer2.CloudDensity, CloudLayer3.CloudDensity, CloudLayer4.CloudDensity); WeatherMakerShaderIds.SetFloatArray(m, "_CloudLightAbsorption", CloudLayer1.CloudLightAbsorption, CloudLayer2.CloudLightAbsorption, CloudLayer3.CloudLightAbsorption, CloudLayer4.CloudLightAbsorption); WeatherMakerShaderIds.SetFloatArray(m, "_CloudSharpness", CloudLayer1.CloudSharpness, CloudLayer2.CloudSharpness, CloudLayer3.CloudSharpness, CloudLayer4.CloudSharpness); WeatherMakerShaderIds.SetFloatArray(m, "_CloudShadowThreshold", CloudLayer1.CloudShadowThreshold, CloudLayer2.CloudShadowThreshold, CloudLayer3.CloudShadowThreshold, CloudLayer4.CloudShadowThreshold); float shadowDotPower = Mathf.Clamp(Mathf.Pow(3.0f * Vector3.Dot(Vector3.down, WeatherMakerScript.Instance.Sun.Transform.forward), 0.5f), 0.0f, 1.0f); float shadowPower1 = Mathf.Lerp(2.0f, CloudLayer1.CloudShadowPower, shadowDotPower); float shadowPower2 = Mathf.Lerp(2.0f, CloudLayer2.CloudShadowPower, shadowDotPower); float shadowPower3 = Mathf.Lerp(2.0f, CloudLayer3.CloudShadowPower, shadowDotPower); float shadowPower4 = Mathf.Lerp(2.0f, CloudLayer4.CloudShadowPower, shadowDotPower); WeatherMakerShaderIds.SetFloatArray(m, "_CloudShadowPower", shadowPower1, shadowPower2, shadowPower3, shadowPower4); WeatherMakerShaderIds.SetFloatArray(m, "_CloudRayOffset", CloudLayer1.CloudRayOffset, CloudLayer2.CloudRayOffset, CloudLayer3.CloudRayOffset, CloudLayer4.CloudRayOffset); #if UNITY_EDITOR if (Application.isPlaying) { #endif float cover = CloudCoverTotal * (1.5f - CloudLightAbsorptionTotal); float sunIntensityMultiplier = Mathf.Clamp(1.0f - (CloudDensityTotal * 0.85f), 0.0f, 1.0f); WeatherMakerScript.Instance.DayNightScript.DirectionalLightIntensityMultipliers["WeatherMakerFullScreenCloudsScript"] = sunIntensityMultiplier * Mathf.Lerp(1.0f, DirectionalLightIntensityMultiplier, cover); float sunShadowMultiplier = Mathf.Lerp(1.0f, 0.0f, Mathf.Clamp(((CloudDensityTotal + cover) * 0.85f), 0.0f, 1.0f)); WeatherMakerScript.Instance.DayNightScript.DirectionalLightShadowIntensityMultipliers["WeatherMakerFullScreenCloudsScript"] = sunShadowMultiplier * Mathf.Lerp(1.0f, DirectionalLightShadowStrengthMultiplier, cover); #if UNITY_EDITOR } #endif } else { #if UNITY_EDITOR if (Application.isPlaying) { #endif WeatherMakerScript.Instance.DayNightScript.DirectionalLightIntensityMultipliers["WeatherMakerFullScreenCloudsScript"] = 1.0f; WeatherMakerScript.Instance.DayNightScript.DirectionalLightShadowIntensityMultipliers["WeatherMakerFullScreenCloudsScript"] = 1.0f; #if UNITY_EDITOR } #endif } }