Esempio n. 1
0
 private void onSceneRenderingQualityChanged(SceneRenderingQuality _newQuality, SceneRenderingQuality _oldQuality)
 {
     if (m_wndView != null)
     {
         m_wndView.onSceneRenderingQualityChanged(_newQuality, _oldQuality);
     }
 }
Esempio n. 2
0
    private static void OnSceneRenderingQualityChaned(SceneRenderingQuality newQuality, SceneRenderingQuality oldQuality)
    {
        currSkinShowCount = MinSkinShowCount;
        if (newQuality == SceneRenderingQuality.Fastest)
        {
            currSkinShowCount = MinSkinShowCount;
        }
        else if (newQuality == SceneRenderingQuality.Good)
        {
            currSkinShowCount = MinSkinShowCount;
        }
        else if (newQuality == SceneRenderingQuality.High)
        {
            currSkinShowCount = 14;
        }
        else if (newQuality == SceneRenderingQuality.Best)
        {
            currSkinShowCount = MaxSkinShowCount;
        }
        //算上自己
        currSkinShowCount++;

        if (newQuality != oldQuality)
        {
            ResetCulling();
        }
    }
Esempio n. 3
0
    private void FindHardwareWaterSupport()
    {
        hardWateSupportQuality = SceneRenderingQuality.Fastest;
        if (!SystemInfo.supportsRenderTextures || !m_Renderer)
        {
            return;
        }



        Material mat = m_Renderer.sharedMaterial;

        if (!mat)
        {
            return;
        }


        string mode = mat.GetTag("WATERMODE", false);

        if (mode == "Refractive")
        {
            hardWateSupportQuality = SceneRenderingQuality.High;
        }
    }
Esempio n. 4
0
 internal void onSceneRenderingQualityChanged(SceneRenderingQuality _newQuality, SceneRenderingQuality _oldQuality)
 {
     if (_newQuality > SceneRenderingQuality.Good)
     {
         (m_materialEffectParam as UEffectMaterialParam).ReturnEffectMaterial.SetColor("_TintColor", new Color(0, 0, 0, 0.86f));
     }
     else
     {
         (m_materialEffectParam as UEffectMaterialParam).ReturnEffectMaterial.SetColor("_TintColor", new Color(0.5f, 0.5f, 0.5f, 0.86f));
     }
 }
Esempio n. 5
0
 void onImageSettingSceneRenderingQualityChanged(SceneRenderingQuality _newQuality, SceneRenderingQuality _oldQuality)
 {
     if (FullScreenMovieImage.gameObject.activeSelf)
     {
         if (_newQuality <= SceneRenderingQuality.Fastest)
         {
             FullScreenMovieTexture.Stop();
             FullScreenMovieTexture.loop = false;
         }
         else
         {
             FullScreenMovieTexture.Play();
             FullScreenMovieTexture.loop = true;
         }
     }
 }
Esempio n. 6
0
    /// <summary>
    /// 设置像素灯质量
    /// </summary>
    /// <param name="quality"></param>
    public static void SetPixelLightQuality(SceneRenderingQuality quality)
    {
        switch (quality)
        {
        case SceneRenderingQuality.Fastest:
            SetPixelLight_Fastest();
            break;

        case SceneRenderingQuality.Good:
            SetPixelLight_Good();
            break;

        case SceneRenderingQuality.High:
            SetPixelLight_High();
            break;

        case SceneRenderingQuality.Best:
            SetPixelLight_Best();
            break;
        }
    }
Esempio n. 7
0
    /// <summary>
    /// 设置纹理质量
    /// </summary>
    /// <param name="quality"></param>
    public static void SetSceneRenderingQuality(IEnumerable <SceneResInfoManager> Instances, SceneRenderingQuality quality, bool bForce = false)
    {
        if (OldSceneRenderingQuality == quality && !bForce)
        {
            return;
        }

        switch (quality)
        {
        case SceneRenderingQuality.Fastest:
            foreach (SceneResInfoManager Instance in Instances)
            {
                if (Instance)
                {
                    Instance.OnSceneRenderingQuality_Fastest();
                }
            }
            ImageEffects.ImageEffectManager.API_ImageQuality_Fastest();
            break;

        case SceneRenderingQuality.Good:
            foreach (SceneResInfoManager Instance in Instances)
            {
                if (Instance)
                {
                    Instance.OnSceneRenderingQuality_Good();
                }
            }
            ImageEffects.ImageEffectManager.API_ImageQuality_Good();
            break;

        case SceneRenderingQuality.High:
            foreach (SceneResInfoManager Instance in Instances)
            {
                if (Instance)
                {
                    Instance.OnSceneRenderingQuality_High();
                }
            }
            ImageEffects.ImageEffectManager.API_ImageQuality_High();
            break;

        case SceneRenderingQuality.Best:
            foreach (SceneResInfoManager Instance in Instances)
            {
                if (Instance)
                {
                    Instance.OnSceneRenderingQuality_Best();
                }
            }
            ImageEffects.ImageEffectManager.API_ImageQuality_Best();
            break;
        }
        SetPixelLightQuality(quality);
        SetRealTimeReflectionProbe(quality);
        if (OnSceneRenderingQualityChanged != null)
        {
            OnSceneRenderingQualityChanged(quality, OldSceneRenderingQuality);
        }

        currData.currSceneRenderingQuality = quality;
        OldSceneRenderingQuality           = quality;
    }
Esempio n. 8
0
 /// <summary>
 /// 设置纹理质量
 /// </summary>
 /// <param name="quality"></param>
 public static void SetSceneRenderingQuality(SceneRenderingQuality quality, bool bForce = false)
 {
     SetSceneRenderingQuality(SceneResInfoManager.AllInstance, quality, bForce);
 }
Esempio n. 9
0
    private void CreateWaterObjects(Camera currentCamera, out Camera reflectionCamera, out Camera refractionCamera)
    {
        SceneRenderingQuality mode = GetWaterMode();

        reflectionCamera = null;
        refractionCamera = null;

        if (mode >= SceneRenderingQuality.High)
        {
            // 反射相机
            m_ReflectionCameras.TryGetValue(currentCamera, out reflectionCamera);
            if (!reflectionCamera)
            {
                GameObject go = new GameObject("Water Refl Camera id" + GetInstanceID() + " for " + currentCamera.GetInstanceID(), typeof(Camera));
                reflectionCamera = go.GetComponent <Camera>();
                reflectionCamera.transform.SetPosition(transform.position);
                reflectionCamera.transform.rotation = transform.rotation;
                reflectionCamera.gameObject.AddComponent <FlareLayer>();
                reflectionCamera.renderingPath = RenderingPath.VertexLit;

                WaterHelper helper = reflectionCamera.gameObject.AddComponent <WaterHelper>();
                helper.hostWater  = this;
                helper.hostCamera = reflectionCamera;

                WaterCullLayer  = 0;
                WaterCullLayer |= 1 << WaterObjLayer;                                   //反射水物体
                WaterCullLayer |= 1 << LayerMask.NameToLayer(Config.LayerPlayerEnemy);  //反射友方玩家
                WaterCullLayer |= 1 << LayerMask.NameToLayer(Config.LayerPlayerFriend); //反射敌方玩家
                WaterCullLayer |= 1 << LayerMask.NameToLayer(Config.LayerHero);         //反射主角玩家
                reflectionCamera.cullingMask = WaterCullLayer;

                int layer = currentCamera.cullingMask;
                layer = layer & ~(1 << WaterObjLayer);
                currentCamera.cullingMask      = layer;
                reflectionCamera.targetTexture = m_ReflectionTexture;

                go.hideFlags = HideFlags.HideAndDontSave;
                m_ReflectionCameras[currentCamera] = reflectionCamera;
            }

            //反射RT
            if (!m_ReflectionTexture || m_OldReflectionTextureSize != m_TextureSize)
            {
                if (m_ReflectionTexture)
                {
                    DestroyImmediate(m_ReflectionTexture);
                }
                m_ReflectionTexture              = new RenderTexture(m_TextureSize, m_TextureSize, 16);
                m_ReflectionTexture.name         = "__WaterReflection" + GetInstanceID();
                m_ReflectionTexture.isPowerOfTwo = true;
                m_ReflectionTexture.hideFlags    = HideFlags.DontSave;
                m_OldReflectionTextureSize       = m_TextureSize;
                reflectionCamera.targetTexture   = m_ReflectionTexture;
            }
        }

        if (mode >= SceneRenderingQuality.Best)
        {
            // 折射相机
            m_RefractionCameras.TryGetValue(currentCamera, out refractionCamera);
            if (!refractionCamera)
            {
                GameObject go = new GameObject("Water Refr Camera id" + GetInstanceID() + " for " + currentCamera.GetInstanceID(), typeof(Camera));
                refractionCamera = go.GetComponent <Camera>();
                refractionCamera.transform.SetPosition(transform.position);
                refractionCamera.transform.rotation = transform.rotation;
                refractionCamera.gameObject.AddComponent <FlareLayer>();
                refractionCamera.renderingPath = RenderingPath.VertexLit;

                WaterHelper helper = refractionCamera.gameObject.AddComponent <WaterHelper>();
                helper.hostWater  = this;
                helper.hostCamera = refractionCamera;

                refractionCamera.targetTexture = m_RefractionTexture;
                WaterCullLayer  = 0;
                WaterCullLayer |= 1 << WaterObjLayer;                                   //反射水物体
                WaterCullLayer |= 1 << LayerMask.NameToLayer(Config.LayerPlayerEnemy);  //反射友方玩家
                WaterCullLayer |= 1 << LayerMask.NameToLayer(Config.LayerPlayerFriend); //反射敌方玩家
                WaterCullLayer |= 1 << LayerMask.NameToLayer(Config.LayerHero);         //反射主角玩家
                refractionCamera.cullingMask = WaterCullLayer;

                int layer = currentCamera.cullingMask;
                layer = layer & ~(1 << WaterObjLayer);;
                currentCamera.cullingMask = layer;

                go.hideFlags = HideFlags.HideAndDontSave;
                m_RefractionCameras[currentCamera] = refractionCamera;
            }

            // 折射RT
            if (!m_RefractionTexture || m_OldRefractionTextureSize != m_TextureSize)
            {
                if (m_RefractionTexture)
                {
                    DestroyImmediate(m_RefractionTexture);
                }
                m_RefractionTexture              = new RenderTexture(m_TextureSize, m_TextureSize, 16);
                m_RefractionTexture.name         = "__WaterRefraction" + GetInstanceID();
                m_RefractionTexture.isPowerOfTwo = true;
                m_RefractionTexture.hideFlags    = HideFlags.DontSave;
                m_OldRefractionTextureSize       = m_TextureSize;
                refractionCamera.targetTexture   = m_RefractionTexture;
            }
        }
    }
Esempio n. 10
0
    public void LateUpdate()
    {
        if (!enabled || !m_Renderer || !m_Renderer.sharedMaterial || !m_Renderer.enabled)
        {
            return;
        }

        Camera cam = Initialize.mainCam;

        if (!cam)
        {
            cam = Camera.current;
            if (!cam)
            {
                return;
            }
        }

        SceneRenderingQuality mode = GetWaterMode();

        if (mode != lastQuality)
        {
            lastQuality = mode;
            if (mode == SceneRenderingQuality.Fastest)
            {
                ImageEffects.ImageEffectManager.API_DeAttachCameraRenderFlags(cam, ref nodes);
                ResetAllRenders();
                ReleaseRelectionSource();
                ReleaseRefractionSource();
            }
            else
            {
                nodes = ImageEffects.ImageEffectManager.API_AttachCameraRenderFlags(cam, DepthTextureMode.Depth);
            }
        }
        UpdateOptimiezed(mode);
        RenderMap(mode, cam);

        if (mode >= SceneRenderingQuality.High)
        {
            m_Renderer.sharedMaterial.SetTexture("_ReflectionTex", m_ReflectionTexture);
        }
        if (mode >= SceneRenderingQuality.Best)
        {
            m_Renderer.sharedMaterial.SetTexture("_RefractionTex", m_RefractionTexture);
        }


        // 根据水模式设置Shader
        switch (mode)
        {
        case SceneRenderingQuality.Fastest:
            Shader.EnableKeyword("WATER_SIMPLE");
            Shader.DisableKeyword("WATER_REFLECTIVE");
            Shader.DisableKeyword("WATER_REFRACTIVE");
            break;

        case SceneRenderingQuality.High:
            Shader.DisableKeyword("WATER_SIMPLE");
            Shader.EnableKeyword("WATER_REFLECTIVE");
            Shader.DisableKeyword("WATER_REFRACTIVE");
            break;

        case SceneRenderingQuality.Best:
            Shader.DisableKeyword("WATER_SIMPLE");
            Shader.DisableKeyword("WATER_REFLECTIVE");
            Shader.EnableKeyword("WATER_REFRACTIVE");
            break;
        }
    }
Esempio n. 11
0
    public void RenderMap(SceneRenderingQuality mode, Camera cam, bool isBake = false)
    {
        if (!cam)
        {
            return;
        }

        //有多个相机的话,会触发多次,多个相机只绘制一次
        if (s_InsideWater)
        {
            return;
        }
        s_InsideWater = true;


        // 禁用像素灯,可以提高效率


        Camera reflectionCamera, refractionCamera;

        CreateWaterObjects(cam, out reflectionCamera, out refractionCamera);

        // 根据法线和坐标计算反射平面
        Vector3 pos    = transform.position;
        Vector3 normal = transform.up;

        UpdateCameraModes(cam, reflectionCamera);
        UpdateCameraModes(cam, refractionCamera);

        if (reflectionCamera)
        {
            reflectionCamera.enabled = false;
        }

        if (refractionCamera)
        {
            refractionCamera.enabled = false;
        }


        // 渲染反射贴图
        if (mode >= SceneRenderingQuality.High)
        {
            if (lastReflectionCamera != reflectionCamera)
            {
                if (lastReflectionCamera)
                {
                    lastReflectionCamera.enabled = false;
                }

                lastReflectionCamera = reflectionCamera;
            }
            reflectionCamera.enabled = true;
            // 计算反射相机的反射平面
            float   d = -Vector3.Dot(normal, pos) - m_ClipPlaneOffset;
            Vector4 reflectionPlane = new Vector4(normal.x, normal.y, normal.z, d);

            Matrix4x4 reflection = Matrix4x4.zero;
            CalculateReflectionMatrix(ref reflection, reflectionPlane);
            Vector3 oldpos = cam.transform.position;
            Vector3 newpos = reflection.MultiplyPoint(oldpos);
            reflectionCamera.worldToCameraMatrix = cam.worldToCameraMatrix * reflection;

            // 计算裁剪面
            Vector4 clipPlane = CameraSpacePlane(reflectionCamera, pos, normal, 1.0f);
            reflectionCamera.projectionMatrix = cam.CalculateObliqueMatrix(clipPlane);

            bool OldCulling = GL.invertCulling;
            GL.invertCulling = true;

            reflectionCamera.transform.SetPosition(newpos);
            Vector3 euler = cam.transform.eulerAngles;
            reflectionCamera.transform.eulerAngles = new Vector3(-euler.x, euler.y, euler.z);

            //reflectionCamera.transform.SetPosition( oldpos;
            GL.invertCulling = OldCulling;
        }

        // 渲染折射贴图
        if (mode >= SceneRenderingQuality.Best)
        {
            if (lastRefractionCamera != refractionCamera)
            {
                if (lastRefractionCamera)
                {
                    lastRefractionCamera.enabled = false;
                }
                lastRefractionCamera = refractionCamera;
            }

            lastRefractionCamera.enabled         = true;
            refractionCamera.worldToCameraMatrix = cam.worldToCameraMatrix;
            // 裁剪面
            Vector4 clipPlane = CameraSpacePlane(refractionCamera, pos, normal, -1.0f);
            refractionCamera.projectionMatrix = cam.CalculateObliqueMatrix(clipPlane);

            refractionCamera.transform.SetPosition(cam.transform.position);
            refractionCamera.transform.rotation = cam.transform.rotation;
        }

        s_InsideWater = false;
    }
Esempio n. 12
0
 /// <summary>
 /// 设置实时反射探针
 /// </summary>
 /// <param name="bEnable"></param>
 public static void SetRealTimeReflectionProbe(SceneRenderingQuality quality)
 {
     QualitySettings.realtimeReflectionProbes = quality >= SceneRenderingQuality.Best;
 }
Esempio n. 13
0
    private void UpdateOptimiezed(SceneRenderingQuality mode)
    {
        if (!bBaked)
        {
            return;
        }

        if (mode <= SceneRenderingQuality.Fastest)
        {
            return;
        }
        if (!Camera.current)
        {
            return;
        }

        Camera cam = Initialize.mainCam;

        if (!cam)
        {
            cam = Camera.current;
            if (!cam)
            {
                return;
            }
        }
        Transform camTrans = cam.transform;
        int       cout     = WaterRefAeraList.Count;

        for (int i = 0; i < cout; i++)
        {
            Vector3 pos            = camTrans.position;
            Bounds  instanceBounds = InstanceBoundsList[i];

            float boundsSize = GameUtil.GetSqrDistanceWithOutY(instanceBounds.min, instanceBounds.center);
            float centerDis  = GameUtil.GetSqrDistanceWithOutY(instanceBounds.center, pos);


            if (centerDis < boundsSize)
            {
                GameObject go = null;
                if (RefAreaRootObjTable.TryGetValue(WaterRefAeraList[i], out go))
                {
                    go.transform.SetPosition(Vector3.zero);
                }
                RefAreaEnabledStateList[i] = true;
            }
            else
            {
                if (RefAreaEnabledStateList[i])
                {
                    GameObject go = null;
                    if (RefAreaRootObjTable.TryGetValue(WaterRefAeraList[i], out go))
                    {
                        go.transform.SetPosition(Vector3.one * 99990);
                    }
                    RefAreaEnabledStateList[i] = false;
                }
            }
        }
    }