统一材质如何实现基于光照图的简易昼夜变化

  介绍

这篇文章主要介绍统一材质如何实现基于光照图的简易昼夜变化,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

统一材质如何实现基于光照图的简易昼夜变化

<图数据大?罢!?

统一材质如何实现基于光照图的简易昼夜变化


好,还是先上一张最终效果的动态图,变化过程有点卡顿,是因为GIF压缩抽帧导致的,实际没有这个问题。不过应该可以表现出一天的时段变化了。

可能有的朋友发现问题了,哎呀,怎么影子木有变化.....是的,变不了,因为我们这是基于烘焙过得光照图做的变化,所以,阴影是固定的。如果我们有实时光,就不是这个教程所涉及的了,直接调整方向光就可以了。

这个方案最早是基于我以前做的一个MMO项目,在几年前,实时光并不现实(现在对于很多项目来说也不现实),光线几乎都是由烘焙后的光照图来决定。但是我们在做一些剧情动画时,又需要一些昼夜变化,通常这些变化还是很快速的。譬如,剧情中写道“就这么,一夜过去了.....”,如果这时候能加一个快速变化的光照系统,还是很有画面感的,对吧?然后,就有了这个暴力简陋版昼夜系统。

为什么说它暴力简陋版呢?因为它真的很暴力,我们最终想到的性能最优办法,就是直接修改所有材质的颜色,当然最终如果实现出好的效果的话,还是需要很多方面考量的,这里只提供一个简单的解题思路。

修改材质的颜色,总不能让我们写代码去挨个遍历场景中所有的材质来修改颜色吧,累死了,而且一想就知道性能堪忧。好在统一为我们提供了一个便利的修改方法,就是全局修改材质属性。我们来看看官方的这个API,修改全局材质颜色的,(材质。SetGlobalColor)。

<图数据大?罢!? 统一材质如何实现基于光照图的简易昼夜变化”>
  </图> <p>用起来很简单,这个API可以直接的修改场景里所有叫这个名字的属性,前提是这个属性没有被暴露在编辑器里,也就是说你只能在通过通道里声明它,如果你在属性块里声明了它,对不起,这个API无效,它会优先使用属性块里定义的参数。</p> <p>熟悉了这个API,接下来就简单了,我们只需要在每一个需要变化的材质里,加入一个天光的颜色属性,直接乘上去就行了,最后再全局修改这个颜色。看看下面的材质重点代码,多出来的代码,用手指头都能数的过来。</p> <节> <pre> <代码>,,//这里就是需要修改的全局颜色- - -天光颜色</代码> <代码>,代码,fixed4 _SkyColor; </> <代码> <br/> </代码> <代码>,,空白冲浪(输入,inout SurfaceOutputStandard o){</代码> <代码>,,,//直接乘上去就好了</代码> <代码>,,,fixed4 c=tex2D (_MainTex IN.uv_MainTex) * _Color * _SkyColor; </代码> </pre>
  </节> <p>好,还没完,重点是我们需要用一个脚本来控制修改这个颜色。</p> <p>这里我写了四个时段的颜色,分别是,早晨,中午,下午、晚上(事实上如果不计较细节,早晨和中午可以合并)。并把这四个颜色暴露出来,供场景人员修改。还有一个一整天循环一次所需要的时间,单位为秒。</p> <图数据大?罢!? <img src=统一材质如何实现基于光照图的简易昼夜变化