unity shader——特效与音乐相结合
特效与音乐的结合,也并没有太大难度,特效部分提供一些可控接口,音乐部分提供波谱数值即可。
第一步非常好实现,国内这块儿的资料还是比较多的。
第二步看起来难,实际上过来人点一点,就透亮了。
在unity中,不需要再实现获取即时音乐数据之类麻烦的底层代码了,使用这个函数:
(unity圣典,能看懂英文部分尽量看英文,汉化估计是直接拿软件翻过来的)
这个函数的用法是在每个 UPDATE 函数内部取样,它会自动从当前播放到的位置取,具体参数设置可以参照unity圣典。
百说不如一做,代码放一下:
using UnityEngine; using System.Collections; public class lightController : MonoBehaviour { public Renderer light1, light2, light3, light4; public float dumpX=0.3f, dumpY=0.3f, dumpZ=0.3f; // 采样宽度 public int sampWidth = 128; public float scaleAmount = 4; private float[] specTrum; // Use this for initialization void Start () { } // Update is called once per frame void Update () { specTrum = audio.GetSpectrumData(sampWidth, 0, FFTWindow.BlackmanHarris); float totalValue = 0; int i = 0; while (i < sampWidth) { totalValue = totalValue + specTrum[i]; i++; } dumpZ = totalValue*scaleAmount; // light1.material.SetFloat ("_DampZ", dumpZ); // light1.material.SetFloat ("_DampX", dumpX); light1.material.SetFloat ("_DampY", dumpY); // light2.material.SetFloat ("_DampZ", dumpZ); // light2.material.SetFloat ("_DampX", dumpX); light2.material.SetFloat ("_DampY", dumpY); // light3.material.SetFloat ("_DampZ", dumpZ); // light3.material.SetFloat ("_DampX", dumpX); light3.material.SetFloat ("_DampY", dumpY); // light4.material.SetFloat ("_DampZ", dumpZ); // light4.material.SetFloat ("_DampX", dumpX); light4.material.SetFloat ("_DampY", dumpY); } }
关于shader的内容,可以参照这篇:
http://www.cnblogs.com/SecretMan001/p/4521437.html
OK了,看过代码之后你就会明白了,答案如此简单。
共勉!
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。