Пример #1
0
    public void OnPreFrameBufferChanged(Dropdown dropdown)
    {
        PreFrameBufferSetting setting = settings[dropdown.value];

        DySkyPreFrameBuffers.BindCamera(Camera.main, setting.evt, setting.color, setting.depth);
        if (waterController)
        {
            waterController.Refresh();
        }
    }
Пример #2
0
    public static bool IsDepthEnable(Camera camera)
    {
        if (!IsEnable(camera))
        {
            return(false);
        }
        DySkyPreFrameBuffers pfb = camera.GetComponent <DySkyPreFrameBuffers>();

        return(pfb.mBlitDepth != DepthPrecision.Off);
    }
Пример #3
0
 public static void ReleaseCamera(Camera camera)
 {
     if (!camera)
     {
         return;
     }
     if (IsEnable(camera))
     {
         DySkyPreFrameBuffers pfb = camera.GetComponent <DySkyPreFrameBuffers>();
         pfb.enabled = false;
     }
 }
Пример #4
0
    private static void SetupWaterKeys(Material material, Quality quality)
    {
        if (!material || !material.shader)
        {
            return;
        }

        switch (quality)
        {
        case Quality.High:
            Shader.EnableKeyword("DY_SKY_GRAB_PASS_ENABLE");
            Shader.EnableKeyword("DY_SKY_SOFT_EDGE_ENABLE");
            Shader.EnableKeyword("DY_SKY_WATER_HIGH");
            Shader.DisableKeyword("DY_SKY_WATER_MID");
            material.shader.maximumLOD = 300;
            if (DySkyPreFrameBuffers.IsDepthEnable(Camera.main))
            {
                if (Camera.main)
                {
                    Camera.main.depthTextureMode &= ~DepthTextureMode.Depth;
                }
            }
            else
            {
                if (Camera.main)
                {
                    Camera.main.depthTextureMode |= DepthTextureMode.Depth;
                }
            }
            if (DySkyPreFrameBuffers.IsColorEnable(Camera.main))
            {
                material.SetShaderPassEnabled("Always", false);
            }
            else
            {
                material.SetShaderPassEnabled("Always", true);
            }
            break;

        case Quality.Mid:
            Shader.EnableKeyword("DY_SKY_GRAB_PASS_ENABLE");
            Shader.DisableKeyword("DY_SKY_WATER_HIGH");
            Shader.EnableKeyword("DY_SKY_WATER_MID");
            if (DySkyPreFrameBuffers.IsDepthEnable(Camera.main))
            {
                Shader.EnableKeyword("DY_SKY_SOFT_EDGE_ENABLE");
                material.shader.maximumLOD = 250;
            }
            else
            {
                Shader.DisableKeyword("DY_SKY_SOFT_EDGE_ENABLE");
                material.shader.maximumLOD = 200;
            }
            if (Camera.main)
            {
                Camera.main.depthTextureMode &= ~DepthTextureMode.Depth;
            }
            if (DySkyPreFrameBuffers.IsColorEnable(Camera.main))
            {
                material.SetShaderPassEnabled("Always", false);
            }
            else
            {
                material.SetShaderPassEnabled("Always", true);
            }
            break;

        default:
            Shader.DisableKeyword("DY_SKY_GRAB_PASS_ENABLE");
            Shader.DisableKeyword("DY_SKY_SOFT_EDGE_ENABLE");
            Shader.DisableKeyword("DY_SKY_WATER_HIGH");
            Shader.DisableKeyword("DY_SKY_WATER_MID");
            material.shader.maximumLOD = 100;
            if (Camera.main)
            {
                Camera.main.depthTextureMode &= ~DepthTextureMode.Depth;
            }
            break;
        }
    }
Пример #5
0
    private void UpdateDySkyUniforms(float progress01, float timeline24)
    {
        Shader.SetGlobalFloat(Uniforms._DySky_kRayleigh, profile.kRayleigh);
        Shader.SetGlobalFloat(Uniforms._DySky_kMie, profile.kMie);
        Shader.SetGlobalFloat(Uniforms._DySky_tScattering, profile.curveScattering.Evaluate(timeline24));
        Shader.SetGlobalFloat(Uniforms._DySky_tRayleigh, profile.curveRayleigh.Evaluate(timeline24));
        Shader.SetGlobalFloat(Uniforms._DySky_tMie, profile.curveMie.Evaluate(timeline24));
        Shader.SetGlobalColor(Uniforms._DySky_cRayleigh, profile.gradRayleigh.Evaluate(progress01));
        Shader.SetGlobalColor(Uniforms._DySky_cMie, profile.gradMie.Evaluate(progress01));
        Shader.SetGlobalFloat(Uniforms._DySky_tNightIntensity, profile.curveNightIntensity.Evaluate(timeline24));
        Shader.SetGlobalFloat(Uniforms._DySky_tMoonEmissionIntensity, profile.curveMoonEmissionIntensity.Evaluate(timeline24));
        Shader.SetGlobalFloat(Uniforms._DySky_tMoonBrightRange, profile.curveMoonBrightRange.Evaluate(timeline24));
        Shader.SetGlobalColor(Uniforms._DySky_cMoonEmission, profile.gradMoonEmission.Evaluate(progress01));
        Shader.SetGlobalColor(Uniforms._DySky_cMoonBright, profile.gradMoonBright.Evaluate(progress01));
        Shader.SetGlobalVector(Uniforms._DySky_unionMoonPhaseSize,
                               new Vector4(moonPhaseX, moonPhaseY, Mathf.Lerp(21f, 1f, profile.curveMoonSize.Evaluate(timeline24) * moonScale), moonPhaseW));

        Quaternion sunSpace = GetCurrentSunRotation();

        Shader.SetGlobalMatrix(Uniforms._DySky_mSunSpace, Matrix4x4.TRS(Vector3.zero, sunSpace, Vector3.one));
        Shader.SetGlobalFloat(Uniforms._DySky_tSunSize, Mathf.Lerp(11f, 1f, profile.curveSunSize.Evaluate(timeline24) * sunScale));
        Shader.SetGlobalColor(Uniforms._DySky_cSunEmission, profile.gradSunEmission.Evaluate(progress01) * profile.curveSunEmissionIntensity.Evaluate(timeline24));

        float cloudDir = profile.curveCloudDir.Evaluate(timeline24);

        Shader.SetGlobalVector(Uniforms._DySky_unionCloudHeightDirSpeed,
                               new Vector4(profile.kCloudHeight, Mathf.Sin(cloudDir), Mathf.Cos(cloudDir), profile.curveCloudSpeed.Evaluate(timeline24)));
        Shader.SetGlobalFloat(Uniforms._DySky_tCloudDensity, Mathf.Lerp(25.0f, 0.0f, profile.curveCloudDensity.Evaluate(timeline24)));
        Color cCloudMainTint      = profile.gradCloudMainTint.Evaluate(progress01);
        Color cCloudSecondaryTint = profile.gradCloudSecondaryTint.Evaluate(progress01);

        Shader.SetGlobalColor(Uniforms._DySky_cCloudMainTint, QualitySettings.activeColorSpace == ColorSpace.Gamma ? cCloudMainTint : cCloudMainTint.linear);
        Shader.SetGlobalColor(Uniforms._DySky_cCloudSecondaryTint, QualitySettings.activeColorSpace == ColorSpace.Gamma ? cCloudSecondaryTint : cCloudSecondaryTint.linear);

        Shader.SetGlobalMatrix(Uniforms._DySky_mStarfieldSpace, Matrix4x4.TRS(Vector3.zero, Quaternion.Euler(galaxyX, galaxyY, galaxyZ) * sunSpace, Vector3.one));
        Shader.SetGlobalFloat(Uniforms._DySky_tStarfieldIntensity, profile.curveStarfieldIntensity.Evaluate(timeline24));
        Shader.SetGlobalFloat(Uniforms._DySky_tGalaxyIntensity, profile.curveGalaxyIntensity.Evaluate(timeline24));

        Shader.SetGlobalFloat(Uniforms._DySky_tExposure, profile.curveExposure.Evaluate(timeline24));

        if (Camera.main)
        {
            Camera.main.clearFlags = CameraClearFlags.SolidColor;
            Matrix4x4 M = transSkydome.localToWorldMatrix;
            Matrix4x4 V = Camera.main.worldToCameraMatrix;
            Matrix4x4 P = Matrix4x4.Perspective(fov, Camera.main.aspect, 0.3f, 1000f);
#if UNITY_STANDALONE_WIN
            // fixed matrix issue for DX engine
            P = GL.GetGPUProjectionMatrix(P, true);
#else
            // fixed matrix issue for render into RT mode(affected by Image Effect[OnRenderImage])
            P = GL.GetGPUProjectionMatrix(P, renderIntoRT || QualitySettings.antiAliasing > 0 || DySkyPreFrameBuffers.IsEnable(Camera.main));
#endif
            Shader.SetGlobalMatrix(Uniforms._DySky_mMVP, P * V * M);
        }
    }