public void CreateButterflyTexture()
        {
            //int butterflyKernel = FourierCompute.FindKernel("Butterfly");
            int horizontal  = FourierCompute.FindKernel("HorizontalButterflyPass");
            int vertical    = FourierCompute.FindKernel("VerticalButterflyPass");
            int initalize   = FourierCompute.FindKernel("InitializeTexture");
            int bitReverseX = FourierCompute.FindKernel("BitReverseTextureX");
            int bitReverseY = FourierCompute.FindKernel("BitReverseTextureY");

            int readFft = FourierCompute.FindKernel("ReadFFT");
            int shift   = FourierCompute.FindKernel("ShiftTexture");


            int logN = (int)Mathf.Log(N, 2);

            BitReversedBuffer = new ComputeBuffer(N, sizeof(int));
            BitReversedBuffer.SetData(NumberDistributions.GetBitReversedArrayOfSize(N));

            Pong0Texture     = Pong0Texture.Initialize(new Vector2(N, N));
            Pong1Texture     = Pong1Texture.Initialize(new Vector2(N, N));
            WaveTexture      = WaveTexture.Initialize(new Vector2(N, N));
            ButterflyTexture = ButterflyTexture.Initialize(new Vector2(logN, N));

            int dir = TransformInverse ? -1 : 1;

            FourierCompute.SetInt("N", N);
            FourierCompute.SetInt("_Dir", dir);

            FourierCompute.SetTexture(initalize, "_InputTexture", tessendorf.TimedependentHTex);
            FourierCompute.SetTexture(initalize, "_Pong0Texture", Pong0Texture);
            FourierCompute.SetTexture(initalize, "_Pong1Texture", Pong1Texture);

            FourierCompute.SetTexture(bitReverseX, "_Pong0Texture", Pong0Texture);
            FourierCompute.SetTexture(bitReverseX, "_Pong1Texture", Pong1Texture);
            FourierCompute.SetBuffer(bitReverseX, "_BitReversed", BitReversedBuffer);

            FourierCompute.SetTexture(bitReverseY, "_Pong0Texture", Pong0Texture);
            FourierCompute.SetTexture(bitReverseY, "_Pong1Texture", Pong1Texture);
            FourierCompute.SetBuffer(bitReverseY, "_BitReversed", BitReversedBuffer);

            FourierCompute.SetTexture(shift, "_Pong0Texture", Pong0Texture);
            FourierCompute.SetTexture(readFft, "_Pong0Texture", Pong0Texture);

            FourierCompute.SetTexture(horizontal, "_Pong0Texture", Pong0Texture);
            FourierCompute.SetTexture(horizontal, "_Pong1Texture", Pong1Texture);

            FourierCompute.SetTexture(vertical, "_Pong0Texture", Pong0Texture);
            FourierCompute.SetTexture(vertical, "_Pong1Texture", Pong1Texture);

            FourierCompute.Dispatch(initalize, N / 8, N / 8, 1);

            FourierCompute.Dispatch(bitReverseX, N, 1, 1);
            FourierCompute.Dispatch(horizontal, N, 1, 1);
            FourierCompute.Dispatch(bitReverseY, N, 1, 1);
            FourierCompute.Dispatch(vertical, N, 1, 1);


            //FourierCompute.Dispatch(shift, N / 2, N, 1);


            FourierCompute.SetInt("_Dir", -dir);

            /*FourierCompute.Dispatch(bitReverseX, N, 1, 1);
             * FourierCompute.Dispatch(horizontal, N, 1, 1);
             * FourierCompute.Dispatch(bitReverseY, N, 1, 1);
             * FourierCompute.Dispatch(vertical, N, 1, 1);*/

            //Pong0Texture.Save("C:/Users/Dobbydoo/Pictures/Pong0.png");

            if (ShiftFirstPass)
            {
                FourierCompute.Dispatch(shift, N / 2, N, 1);
            }
            if (DrawReal)
            {
                FourierCompute.Dispatch(readFft, N / 8, N / 8, 1);
            }
        }
        public void CreateFrequencyTexture()
        {
            var logN = (int)Mathf.Log(N);

            WaveTexture      = WaveTexture.Initialize(new Vector2(N, N));
            FrequencyTexture = FrequencyTexture.Initialize(new Vector2(N, N));
            ButterflyTexture = ButterflyTexture.Initialize(new Vector2(Mathf.Log(N, 2), N));

            BitReversedBuffer = new ComputeBuffer(N, sizeof(int));
            BitReversedBuffer.SetData(NumberDistributions.GetBitReversedArrayOfSize(N));

            int horizontal  = FourierCompute.FindKernel("HorizontalFFT");
            int vertical    = FourierCompute.FindKernel("VerticalFFT");
            int readFft     = FourierCompute.FindKernel("ReadFFT");
            int shift       = FourierCompute.FindKernel("ShiftTexture");
            int bitReverseX = FourierCompute.FindKernel("BitReverseTextureX");
            int bitReverseY = FourierCompute.FindKernel("BitReverseTextureY");
            int initalize   = FourierCompute.FindKernel("InitializeFrequencyTexture");

            var inputTex = new Texture2D(N, N);

            for (int x = 1; x <= N; x++)
            {
                for (int y = 1; y <= N; y++)
                {
                    inputTex.SetPixel(x - 1, y - 1,
                                      x % 2 == 0
                            ? y % 2 == 0
                                ? new Color((float)(x) / (float)(N / 2), 0, 0, 1) :
                                      new Color(0, 0, (float)y / (float)(N / 2), 1)
                            : y % 2 == 0
                                ? new Color(0, (float)(y) / (float)(N / 2), 0, 1)
                                : new Color(0, 0, 0));
                }
            }
            inputTex.Apply();


            FourierCompute.SetTexture(initalize, "_Input", Input);

            FourierCompute.SetTexture(initalize, "_InitialTexture", WaveTexture);
            FourierCompute.SetTexture(bitReverseY, "_InitialTexture", WaveTexture);
            FourierCompute.SetTexture(bitReverseX, "_InitialTexture", WaveTexture);
            FourierCompute.SetTexture(horizontal, "_InitialTexture", WaveTexture);
            FourierCompute.SetTexture(vertical, "_InitialTexture", WaveTexture);

            FourierCompute.SetTexture(initalize, "_FrequencyTexture", FrequencyTexture);
            FourierCompute.SetTexture(horizontal, "_FrequencyTexture", FrequencyTexture);
            FourierCompute.SetTexture(bitReverseX, "_FrequencyTexture", FrequencyTexture);
            FourierCompute.SetTexture(bitReverseY, "_FrequencyTexture", FrequencyTexture);
            FourierCompute.SetTexture(vertical, "_FrequencyTexture", FrequencyTexture);
            FourierCompute.SetTexture(readFft, "_FrequencyTexture", FrequencyTexture);
            FourierCompute.SetTexture(shift, "_FrequencyTexture", FrequencyTexture);

            FourierCompute.SetBuffer(bitReverseX, "BitReversed", BitReversedBuffer);
            FourierCompute.SetBuffer(bitReverseY, "BitReversed", BitReversedBuffer);
            FourierCompute.SetBuffer(horizontal, "BitReversed", BitReversedBuffer);
            FourierCompute.SetBuffer(vertical, "BitReversed", BitReversedBuffer);

            FourierCompute.SetInt("_Resolution", N);

            FourierCompute.SetFloat("_Time", Time.time + 1);



            //int butterflyKernel = FourierCompute.FindKernel("GenerateButterflyTexture");
            //FourierCompute.SetBuffer(butterflyKernel, "_BitReversed", BitReversedBuffer);
            //FourierCompute.SetTexture(butterflyKernel, "ButterflyTexture", ButterflyTexture);
            //FourierCompute.SetTexture(butterflyKernel, "Pong0Texture", FrequencyTexture);
            //FourierCompute.SetTexture(butterflyKernel, "Pong1Texture", FrequencyTexture);

            FourierCompute.Dispatch(initalize, N / 8, N / 8, 1);

            FourierCompute.Dispatch(bitReverseX, N, 1, 1);
            FourierCompute.Dispatch(horizontal, N, 1, 1);
            FourierCompute.Dispatch(bitReverseY, N, 1, 1);
            FourierCompute.Dispatch(vertical, N, 1, 1);


            //FourierCompute.Dispatch(butterflyKernel, N / 8, N / 8, 1);

            FourierCompute.Dispatch(shift, N / 2, N, 1);

            FourierCompute.Dispatch(readFft, N / 8, N / 8, 1);

            FrequencyTexture.Save("C:/Users/Dobbydoo/Pictures/FrequencySpectrum.png");


            BitReversedBuffer.Release();
        }