using ComputeSharp; using static Cupola.Program; namespace Cupola { internal partial class Program { static void Main(string[] args) { Console.WriteLine("Image Dir?"); string? fileLoc = Console.ReadLine(); if (fileLoc == null) throw new ArgumentException("input should not be NULL"); string[] files = Directory.GetFiles(fileLoc); ReadWriteTexture2D[] images = new ReadWriteTexture2D[files.Length]; for (int i = 0; i < files.Length; i++) { Console.WriteLine(files[i]); images[i] = GraphicsDevice.GetDefault().LoadReadWriteTexture2D(files[i]); } Console.WriteLine("Output: "); string? name = Console.ReadLine(); if (name == null) throw new Exception("UwU"); Console.WriteLine("mode?"); Console.WriteLine(); ConsoleKey key = Console.ReadKey().Key; if (key == ConsoleKey.P) { ReadWriteTexture2D brightest = images[0]; ReadWriteTexture2D output = images[0]; for (int i = 1; i < images.Length; i++) { Console.WriteLine(i.ToString()); ReadWriteTexture2D temp = images[i]; GraphicsDevice.GetDefault().For ( temp.Width, temp.Height, new Brightest(brightest, temp) ); GraphicsDevice.GetDefault().For ( temp.Width, temp.Height, new Average(temp, output) ); GraphicsDevice.GetDefault().For ( temp.Width, temp.Height, new Average(temp, brightest) ); output = temp; } output.Save(name + ".jpg"); } else { ReadWriteTexture2D i1 = images[0]; ReadWriteTexture2D i2 = images[1]; GraphicsDevice.GetDefault().For ( i1.Width, i1.Height, new Average(i1, i2) ); i1.Save(name + ".jpg"); } } [AutoConstructor] public readonly partial struct Brightest : IComputeShader { public readonly IReadWriteNormalizedTexture2D input1; public readonly IReadWriteNormalizedTexture2D input2; // Other captured resources or values here... public void Execute() { float3 i1 = input1[ThreadIds.XY].RGB; float3 i2 = input2[ThreadIds.XY].RGB; float i1Intensity = i1.X * i1.Y * i1.Z; float i2Intensity = i2.X * i2.Y * i2.Z; if (i1Intensity > i2Intensity) { input1[ThreadIds.XY].RGB = i1; } else { input1[ThreadIds.XY].RGB = i2; } } } [AutoConstructor] public readonly partial struct Average : IComputeShader { public readonly IReadWriteNormalizedTexture2D input1; public readonly IReadWriteNormalizedTexture2D input2; // Other captured resources or values here... public void Execute() { float3 i1 = input1[ThreadIds.XY].RGB; float3 i2 = input2[ThreadIds.XY].RGB; float3 o1 = 0; o1.X = (i1.X + i2.X) / 2; o1.Y = (i1.Y + i2.Y) / 2; o1.Z = (i1.Z + i2.Z) / 2; input1[ThreadIds.XY].RGB = o1; } } } }