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(); }
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(); }