背景:开关窗帘过程,让环境在亮和暗之间过度

事先烘培出亮、暗两张Lighting map。然后代码实现,窗帘开关由动作实现,而代码中通过动作执行进度来过度两张Lighting map

  1. void OnAnimatorMove()
  2. {
  3. AnimatorTransitionInfo transitionInfo = animator.GetAnimatorTransitionInfo();
  4. if (transitionInfo.normalizedTime != )//状态切换中
  5. {
  6. }
  7. else
  8. {
  9. AnimatorStateInfo currentAnimatorStateInfo = animator.GetCurrentAnimatorStateInfo();
  10.  
  11. // 开窗
  12. if (currentAnimatorStateInfo.IsName("opening"))
  13. {
  14. LightmapBlender.Instance.OpenWindow(currentAnimatorStateInfo.normalizedTime);
  15. }
  16.  
  17. // 关窗
  18. if (currentAnimatorStateInfo.IsName("closing"))
  19. {
  20. LightmapBlender.Instance.CloseWindow(currentAnimatorStateInfo.normalizedTime);
  21. }
  22. }

动作控制代码

  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 * ( - t) + to.r * t;
  55. blend.g = from.g * ( - t) + to.g * t;
  56. blend.b = from.b * ( - t) + to.b * t;
  57. blend.a = from.a * ( - 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 = ; 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[].lightmapFar = tex;
  78.  
  79. // 切换 Lighting map
  80. LightmapSettings.lightmaps = lightmaps;
  81. }

插值过度Lighting map

Unity 过度光照贴图的更多相关文章

  1. 【Unity】第13章 光照贴图和光影效果

    分类:Unity.C#.VS2015 创建日期:2016-05-19 一.简介 在Unity 5中,Lighting是—种增强场景光照和阴影效果的技术,它可以通过较少的性能消耗使静态场景看上去更真实. ...

  2. unity中使用自定义shader进行光照贴图烘培无法出现透明度的坑爹问题

    最近开发中在对场景进行光照贴图烘焙时发现一个坑爹问题,在使用自定义shader的时候,shader命名中必须包含Transparent路径,否则烘焙的时候不对alpha通道进行计算,烘焙出来都是狗皮膏 ...

  3. Unity Shader-法线贴图(Normal)及其原理

    简介 以前经常听说“模型不好看啊,怎么办啊?”答曰“加法线”,”做了个高模,准备烘一下法线贴图”,“有的美术特别屌,直接画法线贴图”.....法线贴图到底是个什么鬼,当年天真的我真的被这个图形学的奇淫 ...

  4. unity3d-地图制作之光照贴图Lightmapping

    今天无聊随便翻看了暗黑战神的场景资源,发现了一个以前没怎么注意的静态场景优化问题. 什么是静态场景,也就是说这个场景是不会变化.比如MMO游戏中选择人物的场景. 就拿默认的暗黑战神的选择人物场景来看, ...

  5. OpenGL光照2:材质和光照贴图

    本文是个人学习记录,学习建议看教程 https://learnopengl-cn.github.io/ 非常感谢原作者JoeyDeVries和多为中文翻译者提供的优质教程 的内容为插入注释,可以先跳过 ...

  6. unity知识点思维导图

    写了个思维导图,总结了下学习unity的知识点感觉还有其他很多的没写到,等我慢慢在工作中完善它,这是下面的链接,后续会根据他的每一个细节来丰富我的博客. 详细地址: http://naotu.baid ...

  7. Unity优化之贴图

    默认情况下当你把图片导入到unity中时,unity会自动把图片转换成最适合当前平台的压缩格式.如果你有一些特殊的需求,unity也提供了覆盖默认压缩格式的方法,如下图 在图片的Inspector窗口 ...

  8. OpenGL光照贴图

    一:啥叫贴图 上一节中,我们将整个物体的材质定义为一个整体,但现实世界中的物体通常并不只包含有一种材质,而是由多种材质所组成. 拓展之前的系统,引入漫反射和镜面光贴图(Map).这允许我们对物体的漫反 ...

  9. Unity ShaderLab 光照随笔

    unity camera默认3种渲染路径,unity5.50里面有4种 camera Rendering Path 1 vertexLit(逐顶点,一般在vert中处理)  2 forward (前向 ...

随机推荐

  1. Sublime +Markdown+OmniMarkupPreviewer 搭建实时预览的markdown编辑器

    浏览器实时预览 <meta http-equiv="refresh" content="0.1"> auto save 的配置 {"aut ...

  2. 【转】在MAC下使用ISO制作Linux的安装USB盘

    http://www.linuxidc.com/Linux/2013-04/82973.htm 在Mac环境下,将Linux的ISO镜像生成一个Linux的安装盘,和Linux下差不多,只是Mac下有 ...

  3. java实现可安装的exe程序

    java实现可安装的exe程序 通过编写Java代码,实现可安装的exe文件的一般思路: 1.在eclipse中创建java项目,然后编写Java代码,将编写好的Java项目导出一个.jar格式的ja ...

  4. vue 使用lib-flexable,px2rem 进行移动端适配 但是引入的第三方UI组件 vux 的样式缩小,解决方案

    最近在写移动端项目,就想用lib-flexable,px2rem来进行适配,把px转换成rem但是也用到了第三方UI组件库vux,把这个引入发现一个问题就是vux的组件都缩小了,在网上找不到答案,最后 ...

  5. Kafka 基础实战 :消费者和生产者实例

    学习地址: http://www.jikexueyuan.com/course/2036.html

  6. usb driver编写 (转)

    在开头补上LDD3的一句话:如果 USB 驱动没有和另一种处理用户和设备交互的子系统(例如 input, tty, video, 等待)关联, 驱动可使用 USB 主编号为了使用传统的和用户空间之间的 ...

  7. micrium ucprobe使用笔记

    前段时间在学习ucos-iii的时候,用到了micrium ucprobe,发现在调试的时候,很方便,可以直观的看到任务的运行使用情况,全局变量的值变化等,当然详细的可以参考官方文档,也可以参考网上的 ...

  8. Centos7 安装 OwnCloud 私有云

    OwnCloud 一款文件主机服务软件,就是我们平时使用的云存储,不过这是在自己主机的服务器上建立属于自己的私有云,OwnCloud 使用AGPLv3协议发布.本项目是基于PHP和SQLite,MyS ...

  9. 利用http录制jmeter脚本

    1.在WorkBench下新建HTTP(S) Test Script Recorder,默认端口号为8080,假如8080被占用,则使用其他端口号:且为了使录制保存到线程组里,也同时新建一个线程组Tr ...

  10. JavaSE——final修饰符

    一.final 修饰变量,被final修饰的变量在被赋初始值之后,不能对它重新赋值 修饰实例变量,必须显示指定初始值,可以在三个位置指定初始值:         1.定义final实例变量时指定初始值 ...