Compare commits

...

2 Commits

Author SHA1 Message Date
mm00
1bdead0750 Added first image to start SDF and fixed blending 2025-04-01 19:49:39 +02:00
mm00
8173327c79 Multiplied channels by alpha when less than Vector4 2025-04-01 19:49:21 +02:00
2 changed files with 32 additions and 11 deletions

View File

@@ -28,16 +28,16 @@ public static class ImageUtil {
for (int x = 0; x < width; x++) { for (int x = 0; x < width; x++) {
switch (result) { switch (result) {
case float[,] f: case float[,] f:
f[x, y] = span[x].R / max; f[x, y] = span[x].R / max * (span[x].A / max);
break; break;
case Vector2[,] f: case Vector2[,] f:
f[x, y] = new(span[x].R / max, span[x].G / max); f[x, y] = new Vector2(span[x].R / max, span[x].G / max) * new Vector2(span[x].A / max);
break; break;
case Vector3[,] f: case Vector3[,] f:
f[x, y] = new(span[x].R / max, span[x].G / max, span[x].B / max); f[x, y] = new Vector3(span[x].R / max, span[x].G / max, span[x].B / max) * new Vector3(span[x].A / max);
break; break;
case Vector4[,] f: case Vector4[,] f:
f[x, y] = new(span[x].R / max, span[x].G / max, span[x].B / max, span[x].A / max); f[x, y] = new Vector4(span[x].R / max, span[x].G / max, span[x].B / max, span[x].A / max);
break; break;
} }
} }
@@ -88,16 +88,16 @@ public static class ImageUtil {
for (int x = 0; x < width; x++) { for (int x = 0; x < width; x++) {
switch (result) { switch (result) {
case float[,] f: case float[,] f:
f[x, y] = span[x].R / max; f[x, y] = span[x].R / max * (span[x].A / max);
break; break;
case Vector2[,] f: case Vector2[,] f:
f[x, y] = new(span[x].R / max, span[x].G / max); f[x, y] = new Vector2(span[x].R / max, span[x].G / max) * new Vector2(span[x].A / max);
break; break;
case Vector3[,] f: case Vector3[,] f:
f[x, y] = new(span[x].R / max, span[x].G / max, span[x].B / max); f[x, y] = new Vector3(span[x].R / max, span[x].G / max, span[x].B / max) * new Vector3(span[x].A / max);
break; break;
case Vector4[,] f: case Vector4[,] f:
f[x, y] = new(span[x].R / max, span[x].G / max, span[x].B / max, span[x].A / max); f[x, y] = new Vector4(span[x].R / max, span[x].G / max, span[x].B / max, span[x].A / max);
break; break;
} }
} }

View File

@@ -48,6 +48,21 @@ public class Program {
Environment.Exit(1); Environment.Exit(1);
} }
for (int i = 1; i < Images.Count; i++)
{
for (int x = 0; x < Images[i].Width; x++)
{
for (int y = 0; y < Images[i].Height; y++)
{
Images[i].Pixels[x, y].X = MathF.Min(Images[i - 1].Pixels[x, y].X + Images[i].Pixels[x, y].X, MAX);
Images[i].Pixels[x, y].Y = MathF.Min(Images[i - 1].Pixels[x, y].Y + Images[i].Pixels[x, y].X, MAX);
Images[i].Pixels[x, y].Z = MathF.Min(Images[i - 1].Pixels[x, y].Z + Images[i].Pixels[x, y].X, MAX);
}
}
Images[i].Pixels.SaveImage($"./Sum{i}.png");
}
Console.WriteLine("Creating masks..."); Console.WriteLine("Creating masks...");
//for each image pair, create a mask //for each image pair, create a mask
var width = (uint)Images[0].Width; var width = (uint)Images[0].Width;
@@ -89,14 +104,20 @@ public class Program {
var finalImage = new Vector3[width, height]; var finalImage = new Vector3[width, height];
var currStep = 0f; var currStep = 0f;
var stepIncrement = MAX / (Gradients.Count); var stepIncrement = MAX / (Gradients.Count);
for(int x=0; x<width; x++)
for (int y = 0; y < height; y++)
finalImage[x, y] = new Vector3(Images[0].Pixels[x, y].X);
for (var i = 0; i < Gradients.Count; i++) { for (var i = 0; i < Gradients.Count; i++) {
var mask = ImageMasks[i + 1]; var mask = ImageMasks[i + 1];
var gradient = Gradients[i]; var gradient = Gradients[i];
Console.WriteLine($"Applying gradient {i}..., {currStep} -> {currStep + stepIncrement}"); Console.WriteLine($"Applying gradient {i}..., {currStep} -> {currStep + stepIncrement}");
for (var x = 0; x < mask.Mask.GetLength(0); x++) { for (var x = 0; x < mask.Mask.GetLength(0); x++) {
for (var y = 0; y < mask.Mask.GetLength(1); y++) { for (var y = 0; y < mask.Mask.GetLength(1); y++) {
if (mask.Mask[x, y].X == 0) continue; if(gradient[x, y].X == 0) continue;
finalImage[x, y] = new(Remap(gradient[x, y].X, MAX, MIN, currStep, currStep + stepIncrement)); var pixel = new Vector3(Remap(gradient[x, y].X, MIN, MAX, 1.0f-currStep, 1.0f-(currStep + stepIncrement)));
if(pixel.X > finalImage[x, y].X) finalImage[x, y] = pixel;
} }
} }
currStep += stepIncrement; currStep += stepIncrement;
@@ -251,7 +272,7 @@ public class Program {
uint y = (uint)(i / resX); uint y = (uint)(i / resX);
var pixelA = A[x, y]; var pixelA = A[x, y];
float lumaA = (pixelA.X + pixelA.Y + pixelA.Z) / 3; float lumaA = (pixelA.X + pixelA.Y + pixelA.Z) / 3;
float resultPixel = lumaA > 0 ? MAX : MIN; float resultPixel = lumaA > 0.99 ? MAX : MIN;
temp[x, y] = new(resultPixel, 0, 0); temp[x, y] = new(resultPixel, 0, 0);
}); });
return temp; return temp;