首页 > 代码库 > Unity 过度光照贴图
Unity 过度光照贴图
背景:开关窗帘过程,让环境在亮和暗之间过度
事先烘培出亮、暗两张Lighting map。然后代码实现,窗帘开关由动作实现,而代码中通过动作执行进度来过度两张Lighting map
void OnAnimatorMove(){ AnimatorTransitionInfo transitionInfo = animator.GetAnimatorTransitionInfo(0); if (transitionInfo.normalizedTime != 0)//状态切换中 { } else { AnimatorStateInfo currentAnimatorStateInfo = animator.GetCurrentAnimatorStateInfo(0); // 开窗 if (currentAnimatorStateInfo.IsName("opening")) { LightmapBlender.Instance.OpenWindow(currentAnimatorStateInfo.normalizedTime); } // 关窗 if (currentAnimatorStateInfo.IsName("closing")) { LightmapBlender.Instance.CloseWindow(currentAnimatorStateInfo.normalizedTime); } }
1 public Texture2D normalTexture2D; 2 public Texture2D closeWindowTexture2D; 3 public Texture2D dancingTexture2D; 4 5 public Texture2D blendTexture2D; 6 7 private Color[] normalColors; 8 private Color[] closeWindowColors; 9 private Color[] dancingColors;10 11 private Color[] blendColors;12 13 [SerializeField]14 private Transform brightTransform, darkTransform;15 16 [SerializeField]17 private Color brightAmbientLight, darkAmbientLight;18 19 void Awake ()20 {21 normalColors = normalTexture2D.GetPixels();22 closeWindowColors = closeWindowTexture2D.GetPixels();23 24 if (dancingTexture2D != null)25 dancingColors = dancingTexture2D.GetPixels();26 27 blendColors = blendTexture2D.GetPixels();28 }29 30 public void OpenWindow(float t)31 {32 brightTransform.gameObject.SetActive(true);33 darkTransform.gameObject.SetActive(false);34 35 Blend2Textures(closeWindowColors, normalColors, t);36 RenderSettings.ambientLight = Blend2Color(darkAmbientLight, brightAmbientLight, t);37 }38 39 public void CloseWindow(float t)40 {41 brightTransform.gameObject.SetActive(false);42 darkTransform.gameObject.SetActive(true);43 44 Blend2Textures(normalColors, closeWindowColors, t);45 46 // 过度环境光(影响没烘培在Lighting map 中的对象的明暗)47 RenderSettings.ambientLight = Blend2Color(brightAmbientLight, darkAmbientLight, t);48 }49 50 private Color Blend2Color(Color from, Color to, float t)51 {52 Color blend;53 54 blend.r = from.r * (1 - t) + to.r * t;55 blend.g = from.g * (1 - t) + to.g * t;56 blend.b = from.b * (1 - t) + to.b * t;57 blend.a = from.a * (1 - t) + to.a * t;58 59 return blend;60 }61 62 private void Blend2Textures(Color[] from, Color[] to, float t)63 {64 for (int i = 0; i < blendColors.Length; i++)65 blendColors[i] = Blend2Color(from[i], to[i], t);66 67 blendTexture2D.SetPixels(blendColors);68 blendTexture2D.Apply();69 70 SwitchLightmaps(blendTexture2D);71 }72 73 private void SwitchLightmaps(Texture2D tex)74 {75 LightmapData[] lightmaps = LightmapSettings.lightmaps;76 77 lightmaps[0].lightmapFar = tex;78 79 // 切换 Lighting map80 LightmapSettings.lightmaps = lightmaps;81 }
Unity 过度光照贴图
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。