private void CameraPreRender(Camera camera) { // Write CameraOffset if (Outers != null) { var dir = camera.transform.position - transform.position; var pos = transform.InverseTransformPoint(transform.position + dir.normalized * CameraOffset); for (var i = Outers.Count - 1; i >= 0; i--) { var outer = Outers[i]; if (outer != null) { outer.transform.localPosition = pos; } } } // Write camera-dependant shader values if (InnerMaterial != null && OuterMaterial != null) { var cameraPosition = camera.transform.position; var localCameraPosition = transform.InverseTransformPoint(cameraPosition); var localDistance = localCameraPosition.magnitude; var clampedSky = Mathf.InverseLerp(OuterRadius, InnerMeshRadius, localDistance); var innerAtmosphereDepth = default(float); var outerAtmosphereDepth = default(float); var radiusRatio = SgtHelper.Divide(InnerMeshRadius, OuterRadius); var scaleDistance = SgtHelper.Divide(localDistance, OuterRadius); var innerDensity = 1.0f - InnerFog; var outerDensity = 1.0f - OuterFog; SgtHelper.CalculateAtmosphereThicknessAtHorizon(radiusRatio, 1.0f, scaleDistance, out innerAtmosphereDepth, out outerAtmosphereDepth); SgtHelper.SetTempMaterial(InnerMaterial, OuterMaterial); if (scaleDistance > 1.0f) { SgtHelper.EnableKeyword("SGT_A"); // Outside } else { SgtHelper.DisableKeyword("SGT_A"); // Outside } InnerMaterial.SetFloat("_HorizonLengthRecip", SgtHelper.Reciprocal(innerAtmosphereDepth * innerDensity)); OuterMaterial.SetFloat("_HorizonLengthRecip", SgtHelper.Reciprocal(outerAtmosphereDepth * outerDensity)); if (OuterDepthTex != null) { #if UNITY_EDITOR SgtHelper.MakeTextureReadable(OuterDepthTex); #endif OuterMaterial.SetFloat("_Sky", Sky * OuterDepthTex.GetPixelBilinear(clampedSky / outerDensity, 0.0f).a); } UpdateMaterialNonSerialized(); } }
public virtual void SetCurrentCamera(Camera c) { if (c != null) { UpdateMaterial(); var cameraPosition = c.transform.position; var localCameraPosition = transform.InverseTransformPoint(cameraPosition); var localDistance = localCameraPosition.magnitude; var clampedAltitude = Mathf.InverseLerp(MiddleRadius, OuterRadius, localDistance); var innerAtmosphereDepth = default(float); var outerAtmosphereDepth = default(float); var radiusRatio = SgtHelper.Divide(InnerMeshRadius, OuterRadius); var innerHeightRatio = SgtHelper.Divide(MiddleHeight, OuterRadius); var scaleDistance = SgtHelper.Divide(localDistance, OuterRadius); var fog = 1.0f - Fog; SgtHelper.CalculateAtmosphereThicknessAtHorizon(radiusRatio, 1.0f, scaleDistance, out innerAtmosphereDepth, out outerAtmosphereDepth); // Make the fog level reduce when you get closer than the ground height innerAtmosphereDepth = Mathf.Max(innerAtmosphereDepth, innerHeightRatio); if (scaleDistance > 1.0f) { innerKeywords.Add("SGT_A"); outerKeywords.Add("SGT_A"); } if (Smooth == true) { innerKeywords.Add("SGT_B"); outerKeywords.Add("SGT_B"); } SgtHelper.SetKeywords(innerMaterial, innerKeywords); innerKeywords.Clear(); SgtHelper.SetKeywords(outerMaterial, outerKeywords); outerKeywords.Clear(); innerMaterial.SetFloat("_HorizonLengthRecip", SgtHelper.Reciprocal(innerAtmosphereDepth * fog)); outerMaterial.SetFloat("_HorizonLengthRecip", SgtHelper.Reciprocal(outerAtmosphereDepth * fog)); outerMaterial.SetFloat("_Power", CalculateOuterPower(cameraPosition, clampedAltitude)); } }