サウンドと連携させてポストエフェクトを動かしたいです。
下記サイトを参考にスクリプト(コードB)とシェーダー(コードC)を作成し、メインカメラに貼り付けました。
外部サイト:Unity サウンドと同期してぷるぷるするエフェクト
画像のバーを弄ることでエフェクトが付くようにはなったのですが、
サウンドに連動した動きにはなりません。
参照サイトでは下記コード(コードA)でサウンドから情報を取り出し、連動してエフェクトを動かせると書いてあります。
恐らくコードAをコードBもしくはコードCのどこかに追記するということだと理解しています。
(この前提から間違っているかもしれません)
色々試してみたのですが、既存のコードにどう入れても何かしらのエラーが出てしまいます。
どのようにすれば、サウンドと連動させてコードBないしコードCのエフェクトを動かせるのか教えてください。
コードA
C#
1// スペクトラムを取得 2var spectrum = audioSource.GetSpectrumData(resolution, 0, FFTWindow.BlackmanHarris); 3var deltaFreq = AudioSettings.outputSampleRate / resolution; 4 5// スペクトラムから取り出した値を格納する変数 6float low = 0f; 7float mid = 0f; 8float high = 0f; 9 10// 周波数帯に応じて値を取り出す 11for (var i = 0; i < resolution; ++i) { 12 var freq = deltaFreq * i; 13 if (freq <= lowFreqThreshold) low += spectrum[i]; 14 else if (freq <= midFreqThreshold) mid += spectrum[i]; 15 else if (freq <= highFreqThreshold) high += spectrum[i]; 16} 17 18// 値を調整 19low *= lowEnhance; 20mid *= midEnhance; 21high *= highEnhance; 22low *= .15f; 23mid *= .15f; 24high *= .15f; 25 26// ポストエフェクト側の変数に値を渡す 27imageEffest.powerA = high; 28imageEffest.powerB = mid; 29imageEffest.powerC = low;
コードB
c#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class ColorOfset : MonoBehaviour { 6 7 private Material _material; 8 protected string _shaderName = "ImageEffect/ColorOfset"; 9 10 [SerializeField] 11 [Range(1, 1000)] 12 public float speed; 13 [SerializeField] 14 [Range(0, 1)] 15 public float powerA; 16 [SerializeField] 17 [Range(0, 1)] 18 public float powerB; 19 [SerializeField] 20 [Range(0, 1)] 21 public float powerC; 22 23 24 protected virtual void Awake() 25 { 26 Shader shader = Shader.Find(_shaderName); 27 _material = new Material(shader); 28 } 29 30 void OnRenderImage(RenderTexture source, RenderTexture destination) 31 { 32 UpdateMaterial(); 33 34 Graphics.Blit(source, destination, _material); 35 } 36 37 void UpdateMaterial() 38 { 39 _material.SetFloat("_Speed", speed); 40 _material.SetFloat("_PowerA", powerA); 41 _material.SetFloat("_PowerB", powerB); 42 _material.SetFloat("_PowerC", powerC); 43 } 44}
コードc
c#
1Shader "ImageEffect/ColorOfset" 2{ 3 Properties 4 { 5 _MainTex ("Texture", 2D) = "white" {} 6 _Speed ("Speed", Range(1, 1000)) = 500 7 _PowerA ("PowerA", Range(0, 1)) = 0 8 _PowerB ("PowerB", Range(0, 1)) = 0 9 _PowerC ("PowerC", Range(0, 1)) = 0 10 } 11 SubShader 12 { 13 // No culling or depth 14 Cull Off ZWrite Off ZTest Always 15 16 Pass 17 { 18 CGPROGRAM 19 #pragma vertex vert 20 #pragma fragment frag 21 22 #include "UnityCG.cginc" 23 24 25 struct appdata 26 { 27 float4 vertex : POSITION; 28 float2 uv : TEXCOORD0; 29 }; 30 31 struct v2f 32 { 33 float2 uv : TEXCOORD0; 34 float4 vertex : SV_POSITION; 35 }; 36 37 v2f vert (appdata v) 38 { 39 v2f o; 40 o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); 41 o.uv = v.uv; 42 return o; 43 } 44 45 46 // 47 float rand(float2 co) { 48 return frac(sin(dot(co.xy, float2(12.9898, 78.233))) * 43758.5453); 49 } 50 51 // 52 sampler2D _MainTex; 53 float _Speed; 54 float _PowerA; 55 float _PowerB; 56 float _PowerC; 57 58 fixed4 frag (v2f i) : SV_Target 59 { 60 fixed4 tex = tex2D(_MainTex, i.uv); 61 62 float3 col; 63 float time = _Time * _Speed; 64 65 float ran = rand(float2(1, 10)); 66 67 col.r = tex2D(_MainTex, i.uv).r; 68 col.g = tex2D(_MainTex, i.uv - float2(cos(time) * .05 * _PowerA * rand(float2(-50, 50)), sin(time) * .035) * _PowerC * rand(float2(-25, 25))).g; 69 col.b = tex2D(_MainTex, i.uv - float2(sin(time) * .06 * _PowerB * rand(float2(-50, 50)), cos(time) * .025) * _PowerC * rand(float2(-25, 25))).b; 70 71 return float4(col, 1); 72 } 73 ENDCG 74 } 75 } 76}
回答3件
あなたの回答
tips
プレビュー