Exemple #1
0
        public void VisualizeNoiseGpu()
        {
            if (NoiseTexture == null)
            {
                return;
            }

            int kernel             = FFTComputeShader.FindKernel("Setup");
            int displacementKernel = FFTComputeShader.FindKernel("GenerateDisplacementTexture");
            int butterflyKernel    = FFTComputeShader.FindKernel("GenerateButterflyTexture");

            FFTComputeShader.SetTexture(kernel, "H0KTexture", H0KTex);
            FFTComputeShader.SetTexture(kernel, "HTKTexture", TimedependentHTex);
            FFTComputeShader.SetTexture(kernel, "H0NegKTexture", H0NegativeKTex);
            FFTComputeShader.SetTexture(kernel, "ButterflyTexture", ButterflyTexture);
            FFTComputeShader.SetTexture(kernel, "Pong0Texture", Pong0Texture);
            FFTComputeShader.SetTexture(kernel, "Pong1Texture", Pong1Texture);
            FFTComputeShader.SetTexture(kernel, "DisplacementTexture", DisplacementTexture);
            FFTComputeShader.SetTexture(kernel, "NoiseTexture", NoiseTexture);
            FFTComputeShader.SetFloat("_Time", Time.time + 1);
            FFTComputeShader.SetFloat("_Amplitude", Amplitude);
            FFTComputeShader.SetFloat("_WindForce", WindForce);
            FFTComputeShader.SetVector("_WindDirection", WindDirection);
            FFTComputeShader.SetFloat("_Depth", Depth);
            FFTComputeShader.SetInt("_Resolution", N);

            FFTComputeShader.Dispatch(kernel, N / 8, N / 8, 1);

            var bitReversedArray = new int[N];

            for (int j = 0; j < N; j++)
            {
                bitReversedArray[j] = NumberDistributions.BitReverse(j, N);
            }
            BitReversedBuffer = new ComputeBuffer(N, sizeof(int));
            BitReversedBuffer.SetData(bitReversedArray);
            FFTComputeShader.SetBuffer(butterflyKernel, "BitReversed", BitReversedBuffer);

            FFTComputeShader.SetTexture(butterflyKernel, "ButterflyTexture", ButterflyTexture);
            FFTComputeShader.SetTexture(butterflyKernel, "Pong0Texture", Pong0Texture);
            FFTComputeShader.SetTexture(butterflyKernel, "Pong1Texture", Pong1Texture);
            FFTComputeShader.Dispatch(butterflyKernel, N / 8, N / 8, 1);

            FFTComputeShader.SetTexture(displacementKernel, "ButterflyTexture", ButterflyTexture);
            FFTComputeShader.SetTexture(displacementKernel, "Pong0Texture", Pong0Texture);
            FFTComputeShader.SetTexture(displacementKernel, "Pong1Texture", Pong1Texture);
            FFTComputeShader.SetTexture(displacementKernel, "DisplacementTexture", DisplacementTexture);
            FFTComputeShader.Dispatch(displacementKernel, N / 8, N / 8, 1);

            BitReversedBuffer.Release();
        }
Exemple #2
0
        public void CreateGaussianNoiseTexture()
        {
            NoiseTexture = new Texture2D(N, N);

            float mean   = 0;
            float stdDev = 1;

            for (int x = 0; x < N; x++)
            {
                for (int y = 0; y < N; y++)
                {
                    NoiseTexture.SetPixel(x, y,
                                          new Color(
                                              (float)NumberDistributions.GaussianRandom(mean, stdDev),
                                              (float)NumberDistributions.GaussianRandom(mean, stdDev),
                                              (float)NumberDistributions.GaussianRandom(mean, stdDev),
                                              (float)NumberDistributions.GaussianRandom(mean, stdDev)
                                              ));
                }
            }
            NoiseTexture.Apply();
        }
        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();
        }