Esempio n. 1
0
    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));
        }
    }