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

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

void OnAnimatorMove()
{
AnimatorTransitionInfo transitionInfo = animator.GetAnimatorTransitionInfo();
if (transitionInfo.normalizedTime != )//状态切换中
{
}
else
{
AnimatorStateInfo currentAnimatorStateInfo = animator.GetCurrentAnimatorStateInfo(); // 开窗
if (currentAnimatorStateInfo.IsName("opening"))
{
LightmapBlender.Instance.OpenWindow(currentAnimatorStateInfo.normalizedTime);
} // 关窗
if (currentAnimatorStateInfo.IsName("closing"))
{
LightmapBlender.Instance.CloseWindow(currentAnimatorStateInfo.normalizedTime);
}
}

动作控制代码

 public Texture2D normalTexture2D;
public Texture2D closeWindowTexture2D;
public Texture2D dancingTexture2D; public Texture2D blendTexture2D; private Color[] normalColors;
private Color[] closeWindowColors;
private Color[] dancingColors; private Color[] blendColors; [SerializeField]
private Transform brightTransform, darkTransform; [SerializeField]
private Color brightAmbientLight, darkAmbientLight; void Awake ()
{
normalColors = normalTexture2D.GetPixels();
closeWindowColors = closeWindowTexture2D.GetPixels(); if (dancingTexture2D != null)
dancingColors = dancingTexture2D.GetPixels(); blendColors = blendTexture2D.GetPixels();
} public void OpenWindow(float t)
{
brightTransform.gameObject.SetActive(true);
darkTransform.gameObject.SetActive(false); Blend2Textures(closeWindowColors, normalColors, t);
RenderSettings.ambientLight = Blend2Color(darkAmbientLight, brightAmbientLight, t);
} public void CloseWindow(float t)
{
brightTransform.gameObject.SetActive(false);
darkTransform.gameObject.SetActive(true); Blend2Textures(normalColors, closeWindowColors, t); // 过度环境光(影响没烘培在Lighting map 中的对象的明暗)
RenderSettings.ambientLight = Blend2Color(brightAmbientLight, darkAmbientLight, t);
} private Color Blend2Color(Color from, Color to, float t)
{
Color blend; blend.r = from.r * ( - t) + to.r * t;
blend.g = from.g * ( - t) + to.g * t;
blend.b = from.b * ( - t) + to.b * t;
blend.a = from.a * ( - t) + to.a * t; return blend;
} private void Blend2Textures(Color[] from, Color[] to, float t)
{
for (int i = ; i < blendColors.Length; i++)
blendColors[i] = Blend2Color(from[i], to[i], t); blendTexture2D.SetPixels(blendColors);
blendTexture2D.Apply(); SwitchLightmaps(blendTexture2D);
} private void SwitchLightmaps(Texture2D tex)
{
LightmapData[] lightmaps = LightmapSettings.lightmaps; lightmaps[].lightmapFar = tex; // 切换 Lighting map
LightmapSettings.lightmaps = lightmaps;
}

插值过度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. tensorflow目标检测API之建立自己的数据集

    1 收集数据 为了方便,我找了11张月儿的照片做数据集,如图1,当然这在实际应用过程中是远远不够的 2 labelImg软件的安装 使用labelImg软件(下载地址:https://github.c ...

  2. ubuntu系统普通用户密码忘记之重置

    当我们在使用ubuntu系统忘记普通用户登录密码的时候,会被系统在登录界面拒之门外而不得入,这时候只好需要我们去重新设置密码,具体做法如下: 系统重启,在GRUB模式下选择Advanced Optio ...

  3. sphinx中文入门指南 (转自sphinx中文站)

    Sphinx中文入门指南 wuhuiming<blvming在gmail.com>,转载请注明来源和作者 最后修改:2010年1月23日 1.简介 1.1.Sphinx是什么 1.2.Sp ...

  4. Docker 学习基本操作与守护式容器

    Docker 学习基本操作与守护式容器 容器操作 运行容器 docker run --name指定名字 -istdin -ttty虚拟终端 在终端中用 exit 即可退出容器,并结束运行 查看容器 p ...

  5. PHP 日常开发过程中的bug集合(持续更新中。。。)

    PHP 日常开发过程中的bug集合(持续更新中...) 在日常php开发过程中,会遇到一些意想不到的bug,所以想着把这些bug记录下来,以免再犯! 1.字符串 '0.00'.'0.0'.'0'  是 ...

  6. LeetCode(173) Binary Search Tree Iterator

    题目 Implement an iterator over a binary search tree (BST). Your iterator will be initialized with the ...

  7. LeetCode(200) Number of Islands

    题目 Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is su ...

  8. 字符串:HDU3064-最长回文

    最长回文 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Descri ...

  9. isinstance() 函数

    Python3 isinstance() 函数   描述 isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type(). isinstance() 与 type() 区别: t ...

  10. exe4j+Inno_setup打包java桌面应用

    打开exe4j,这里有个注意点,就是欢迎界面下面的License,如果没有请到网上找一个序列号,否则生成的exe打开之后都会先弹出您未激活exe4j的警告!点击下一步 这里有两个选项,第一个是通常编译 ...