Files
2026-02-21 16:45:37 +08:00

68 lines
1.9 KiB
C#

using UnityEngine;
namespace UltimateWater.Internal
{
public sealed class Dx11FFT : GpuFFT
{
private readonly ComputeShader _Shader;
private readonly int _KernelIndex;
public Dx11FFT(ComputeShader shader, int resolution, bool highPrecision, bool twoChannels)
: base(resolution, highPrecision, twoChannels, true)
{
_Shader = shader;
_KernelIndex = _NumButterflies - 5 << 1;
if (twoChannels)
{
_KernelIndex += 10;
}
}
public override void SetupMaterials()
{
}
public override void ComputeFFT(Texture tex, RenderTexture target)
{
TemporaryRenderTexture temporary = _RenderTexturesSet.GetTemporary();
if (!target.IsCreated())
{
target.enableRandomWrite = true;
target.Create();
}
_Shader.SetTexture(_KernelIndex, "_ButterflyTex", base.Butterfly);
_Shader.SetTexture(_KernelIndex, "_SourceTex", tex);
_Shader.SetTexture(_KernelIndex, "_TargetTex", (RenderTexture)temporary);
_Shader.Dispatch(_KernelIndex, 1, tex.height, 1);
_Shader.SetTexture(_KernelIndex + 1, "_ButterflyTex", base.Butterfly);
_Shader.SetTexture(_KernelIndex + 1, "_SourceTex", (RenderTexture)temporary);
_Shader.SetTexture(_KernelIndex + 1, "_TargetTex", target);
_Shader.Dispatch(_KernelIndex + 1, 1, tex.height, 1);
temporary.Dispose();
}
protected override void FillButterflyTexture(Texture2D butterfly, int[][] indices, Vector2[][] weights)
{
Color color = default(Color);
for (int i = 0; i < _NumButterflies; i++)
{
for (int j = 0; j < 2; j++)
{
int num = ((j != 0) ? _Resolution : 0);
for (int k = 0; k < _Resolution; k++)
{
int num2 = _NumButterflies - i - 1;
int num3 = k << 1;
color.r = indices[num2][num3] + num;
color.g = indices[num2][num3 + 1] + num;
color.b = weights[i][k].x;
color.a = weights[i][k].y;
butterfly.SetPixel(num + k, i, color);
}
}
}
}
}
}