Added SDF kernel

This commit is contained in:
Samuele Lorefice
2025-04-02 20:26:28 +02:00
parent 1d64749e76
commit 664c5e02fe
3 changed files with 51 additions and 5 deletions

View File

@@ -133,7 +133,9 @@ public class Program {
kernels.EdgeDetect(maskData.Mask, out var temp);
maskData.Mask = temp;
Parallel.For(0, width * height, parallelOptions, (i) => {
if(maskData.Mask[i % width, i / width].Y != 0) lock (maskData.Edges) maskData.Edges.Add(new(i % width, i / width));
if (maskData.Mask[i % width, i / width].Y == 0) return;
// ReSharper disable once PossibleLossOfFraction
lock (maskData.Edges) maskData.Edges.Add(new(i % width, i / width));
});
sw.Stop();
@@ -179,12 +181,11 @@ public class Program {
static SDFData SDF(MaskData mask) {
var width = (uint)mask.Mask.GetLength(0);
var height = (uint)mask.Mask.GetLength(1);
var temp = new Vector3[width, height];
float AbsMax = MIN;
int iterCount = 0;
var sw = new Stopwatch();
sw.Start();
Parallel.For(0, width * height, parallelOptions, (i) =>
/*Parallel.For(0, width * height, parallelOptions, (i) =>
{
//convert 1D index to 2D index
var x = (int)(i % width);
@@ -210,8 +211,9 @@ public class Program {
ConsoleUpdateLine(
$"Progress: {iterCount / (float)(width * height):P}% | {iterCount / (sw.Elapsed.TotalSeconds):N0} pixels/s");
}
});
});*/
kernels.Sdf(mask.Edges.ToArray(), out var temp);
Console.WriteLine(
$"\nSDF Generation Time: {sw.Elapsed.TotalSeconds:N4}s ({iterCount / sw.Elapsed.TotalSeconds:N0} pixels/s)");
sw.Restart();

View File

@@ -49,4 +49,24 @@ public partial class SdfKernels {
}
}
}
private static void SdfKernel(Index2D index,
ArrayView2D<Vector3, Stride2D.DenseX> sdf,
ArrayView1D<Vector2, Stride1D.Dense> edges,
int width, int height
) {
Vector2 pos = new((float)index.X / width, (float)index.Y / height);
float minDist = 2f;
int count = edges.IntExtent.X;
for (int i = 0; i < count; i++) {
Vector2 edgeNrm = new (edges[i].X/width, edges[i].Y/height);
float dist = Vector2.Distance(pos, edgeNrm);
if (dist < minDist) minDist = dist;
}
if (minDist > 1f) minDist = 1f;
sdf[index] = new(minDist);
}
}

View File

@@ -106,6 +106,30 @@ public partial class SdfKernels {
edge = buffer.GetAsArray2D();
}
public void Sdf(Vector2[] edges, out Vector3[,] sdf) {
var dev = gpuContext.GetPreferredDevice(preferCPU:false);
int width = edges.Length;
int height = edges.Length;
sdf = new Vector3[width, height];
using Accelerator accelerator = dev.CreateAccelerator(gpuContext);
using var buffer = accelerator.Allocate2DDenseX<Vector3>(new (width, height));
using var edgeBuffer = accelerator.Allocate1D<Vector2>(edges.Length);
edgeBuffer.CopyFromCPU(edges);
var sdfKernel = accelerator.LoadAutoGroupedStreamKernel<Index2D,
ArrayView2D<Vector3, Stride2D.DenseX>,
ArrayView1D<Vector2, Stride1D.Dense>,
int, int>(SdfKernel);
sdfKernel(new (width, height), buffer.View, edgeBuffer.View, width, height);
accelerator.Synchronize();
sdf = buffer.GetAsArray2D();
}
private static string GetInfoString(Accelerator a)
{
StringWriter infoString = new StringWriter();