//插值辅助函数 private Color LerpColor2(ShaderSetter.SetterUnit setterUnit, int v, float startTime, float endTime, float rate) { if (setterUnit.ColorSelectorTex == null) { return(Color.black); } //int timePixel = (int)(42.22f * TimeHour); float scale = 42.22f; //每小时占用42.22像素; int timePixelStart = (int)(startTime * scale); int timePixelEnd = (int)(endTime * scale); Color color1 = setterUnit.ColorSelectorTex.GetPixel(timePixelStart, v); Color color2 = setterUnit.ColorSelectorTex.GetPixel(timePixelEnd, v); Color lerpColor = Color.Lerp(color1, color2, rate); return(lerpColor); }
//同一区域,不同时间段的颜色和参数插值(added by thjie 2019-01-16) public void WeatherColorLerp(int setterIndex, float start, float end, float rate) { if (setterIndex < 0 || setterIndex >= Setters.Length) { return; } ShaderSetter.SetterUnit setterUnit = Setters[setterIndex]; if (setterUnit == null) { return; } //颜色变化 if (IsColorSetter) { mCloudyColor = Color.Lerp(Color.white, LerpColor2(setterUnit, 362, start, end, rate), RainForce * 1.667f); mTmpColor = LerpColor2(setterUnit, 533, start, end, rate); Shader.SetGlobalColor("_LightColorC", mTmpColor * mCloudyColor); mTmpColor = LerpColor2(setterUnit, 576, start, end, rate); Shader.SetGlobalColor("_ShadowColor", mTmpColor * mCloudyColor); RenderSettings.ambientLight = mTmpColor * mCloudyColor; mTmpColor = LerpColor2(setterUnit, 619, start, end, rate); Shader.SetGlobalColor("_DFogColorFar", mTmpColor * mCloudyColor); mTmpColor = LerpColor2(setterUnit, 662, start, end, rate); Shader.SetGlobalColor("_DFogColorNear", mTmpColor * mCloudyColor); mTmpColor = LerpColor2(setterUnit, 705, start, end, rate); Shader.SetGlobalColor("_VFogColorLow", mTmpColor * mCloudyColor); mTmpColor = LerpColor2(setterUnit, 748, start, end, rate); Shader.SetGlobalColor("_VFogColorHigh", mTmpColor * mCloudyColor); mTmpColor = LerpColor2(setterUnit, 791, start, end, rate); Shader.SetGlobalColor("_CloudColor", mTmpColor * mCloudyColor); mTmpColor = LerpColor2(setterUnit, 834, start, end, rate); Shader.SetGlobalColor("_BodyColor", mTmpColor * mCloudyColor); Shader.SetGlobalColor("_RimColor", mTmpColor * mCloudyColor); mTmpColor = LerpColor2(setterUnit, 877, start, end, rate); Shader.SetGlobalColor("_ShadowColor1", mTmpColor * mCloudyColor); mTmpColor = LerpColor2(setterUnit, 920, start, end, rate); Shader.SetGlobalColor("_ShadowColor2", mTmpColor * mCloudyColor); if (SkyBoxMat != null) { mTmpColor = LerpColor2(setterUnit, 963, start, end, rate); SkyBoxMat.SetColor("_SkyLowColor", mTmpColor * mCloudyColor); mTmpColor = LerpColor2(setterUnit, 1006, start, end, rate); SkyBoxMat.SetColor("_SkyHighColor", mTmpColor * mCloudyColor); } Shader.SetGlobalFloat("_Rotationbbb", RotationSun); Shader.SetGlobalFloat("_RotationeeeX", RotationMoonX); Shader.SetGlobalFloat("_RotationeeeY", RotationMoonY); mTmpColor = IsUiChara ? UiCharaLight : LerpColor2(setterUnit, 491, start, end, rate) * mCloudyColor; Shader.SetGlobalColor("_LightColorMapping", mTmpColor); mTmpColor = IsUiChara ? UiCharaDark : LerpColor2(setterUnit, 448, start, end, rate) * mCloudyColor; Shader.SetGlobalColor("_DarkColorMapping", mTmpColor); mTmpColor = IsUiChara ? UiCharaSkinDark : LerpColor2(setterUnit, 405, start, end, rate) * mCloudyColor; Shader.SetGlobalColor("_SkinDarkColorMapping", mTmpColor); } //公用变量 if (BRDFTex != null) { Shader.SetGlobalTexture("_BRDFTex", BRDFTex); } if (NoiseTex != null) { Shader.SetGlobalTexture("_NoiseTex", NoiseTex); } //Shader.SetGlobalFloat("_Shininess", Shininess); if (CharaLightModelDiff != null) { Shader.SetGlobalTexture("_MatCap", CharaLightModelDiff); } /*if (CharaLightModelSpec != null) * Shader.SetGlobalTexture("_MatCapSpec", CharaLightModelSpec);*/ Shader.SetGlobalFloat("_StartY", FogStartY); Shader.SetGlobalFloat("_Wetness", Wetness); Shader.SetGlobalFloat("_RainForce", RainForce); Shader.SetGlobalFloat("_EndY", FogHeight); #if UNITY_IOS Shader.SetGlobalFloat("_FinalSaturation", Saturation); #else Shader.SetGlobalFloat("_FinalSaturation", Saturation); #endif Shader.SetGlobalFloat("_FarFogDistance", FarFogDistance); if (Player != null) { Shader.SetGlobalVector("_PlayerPos", Player.position); } if (CloudNoiseTex != null) { Shader.SetGlobalTexture("_CloudNoiseTex", CloudNoiseTex); } }