private void onSceneRenderingQualityChanged(SceneRenderingQuality _newQuality, SceneRenderingQuality _oldQuality) { if (m_wndView != null) { m_wndView.onSceneRenderingQualityChanged(_newQuality, _oldQuality); } }
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(); } }
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; } }
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)); } }
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; } } }
/// <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; } }
/// <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; }
/// <summary> /// 设置纹理质量 /// </summary> /// <param name="quality"></param> public static void SetSceneRenderingQuality(SceneRenderingQuality quality, bool bForce = false) { SetSceneRenderingQuality(SceneResInfoManager.AllInstance, quality, bForce); }
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; } } }
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; } }
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; }
/// <summary> /// 设置实时反射探针 /// </summary> /// <param name="bEnable"></param> public static void SetRealTimeReflectionProbe(SceneRenderingQuality quality) { QualitySettings.realtimeReflectionProbes = quality >= SceneRenderingQuality.Best; }
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; } } } }