public RaytracerGame(IniOptions options) { if (options == null) { throw new ArgumentNullException(nameof(options)); } _options = options; new GraphicsDeviceManager(this) { PreferredBackBufferWidth = options.Width, PreferredBackBufferHeight = options.Height }; _raytracer = _options.Multithreaded ? new MultiThreadedRaytracer() : new Raytracer(); if (options.Width % options.RealtimeRasterLevel != 0) { throw new NotSupportedException("Width must be divisible by RealtimeRasterSize"); } if (options.Height % options.RealtimeRasterLevel != 0) { throw new NotSupportedException("Height must be divisible by RealtimeRasterSize"); } if (options.Width % options.BackgroundRasterLevel != 0) { throw new NotSupportedException("Width must be divisible by RealtimeRasterSize"); } if (options.Height % options.BackgroundRasterLevel != 0) { throw new NotSupportedException("Height must be divisible by RealtimeRasterSize"); } }
static void Main(string[] args) { Scene scene = new Scene(); Raytracer raytracer = new Raytracer(scene); raytracer.OutputFile("..\\..\\result.ppm", 1920, 1080); Console.ReadLine(); }
private void MainForm_Load(object sender, EventArgs e) { //MatrixUtils.UnitTesting ut = new MatrixUtils.UnitTesting(); //ut.AllTests(); Raytracer rt = new Raytracer(); //rt.Eye.Position[0] = 0; //rt.Eye.Position[1] = 50; // big sphere in the back Sphere sphBig = rt.AddSphere(0, 100, -600, 100); sphBig.AmbientColor = new Vector(0.2, 0.2, 0.2); Sphere sphLeftMedium = rt.AddSphere(-60, 75, -200, 50); sphLeftMedium.AmbientColor = new Vector(0.2, 0, 0); sphLeftMedium.DiffuseColor = new Vector(1.0, 0, 0); Sphere sphRightMedium = rt.AddSphere(60, 75, -200, 50); sphRightMedium.AmbientColor = new Vector(0, 0.2, 0); Sphere sphLeftSmall = rt.AddSphere(-85, 0, -100, 25); sphLeftSmall.AmbientColor = new Vector(0, 0, 0.2); Sphere sphRightSmall = rt.AddSphere(85, 0, -100, 25); sphRightSmall.AmbientColor = new Vector(0, 0.2, 0.2); Sphere sphBottom = rt.AddSphere(0, -100, -200, 75); sphRightSmall.AmbientColor = new Vector(0.2, 0, 0.2); Sphere sphBig2 = rt.AddSphere(0, 100, 800, 100); sphBig2.AmbientColor = new Vector(0.2, 0.2, 0.2); Sphere sphLeftMedium2 = rt.AddSphere(-60, 75, 400, 50); sphLeftMedium2.AmbientColor = new Vector(0.2, 0, 0); sphLeftMedium2.DiffuseColor = new Vector(1.0, 0, 0); Sphere sphRightMedium2 = rt.AddSphere(60, 75, 400, 50); sphRightMedium2.AmbientColor = new Vector(0, 0.2, 0); Sphere sphLeftSmall2 = rt.AddSphere(-85, 0, 300, 25); sphLeftSmall2.AmbientColor = new Vector(0, 0, 0.2); Sphere sphRightSmall2 = rt.AddSphere(85, 0, 300, 25); sphRightSmall2.AmbientColor = new Vector(0, 0.2, 0.2); //Sphere sphBottom2 = rt.AddSphere(0, -100, 200, 75); //sphRightSmall2.AmbientColor = new Vector(0.2, 0, 0.2); rt.AddPointLightSource(0, 100, -100); rt.AddPointLightSource(200, 200, 0); rt.AddPointLightSource(0, 0, -1000); pbOutput.Image = rt.Render(pbOutput.Width, pbOutput.Height); }
private void TargetWindow_Load(object sender, EventArgs e) { mImage = new Bitmap(this.Width, Height, PixelFormat.Format24bppRgb); mCamera = new Camera(this, new Vector3(0, 0, 17), new Vector3(0, 1, 0), 35); mScene = new Scene(); //ambient diffuse reflection shiny mScene.Objects.Add(new Sphere(1, new Vector3(0, 0, 1), new Material(Color.Aqua, 0.5f, 0.2f, 0.8f, 4, mScene))); mScene.Objects.Add(new Sphere(1, new Vector3(1, 1, 0), new Material(Color.Red, 0.5f, 0.2f, 0.8f, 4, mScene))); //mScene.Objects.Add(new Sphere(1, new Vector3( 1, -1, 0), new Material(Color.Blue, 0.5f, 0.2f, 0.8f, 4, mScene))); mScene.Objects.Add(new Sphere(1, new Vector3(-1, 1, 2), new Material(Color.Green, 0.5f, 0.2f, 0.8f, 4, mScene))); mScene.Objects.Add(new Sphere(1, new Vector3(-1, -1, 2), new Material(Color.Black, 0.5f, 0.2f, 0.8f, 4, mScene))); mScene.Objects.Add(new Plane(new Vector3(0, 0, 1), new Vector3(0, 0, -3), new Material(Color.AntiqueWhite, 0.5f, 0.2f, 0.8f, 4, mScene))); //Back mScene.Objects.Add(new Plane(new Vector3(0, -1, 0), new Vector3(0, 3, 0), new Material(Color.SkyBlue, 0.5f, 0.2f, 0.8f, 4, mScene))); //Top mScene.Objects.Add(new Plane(new Vector3(1, 0, 0), new Vector3(-3, 0, 0), new Material(Color.LightGreen, 0.5f, 0.2f, 0.8f, 4, mScene))); //Left mScene.Objects.Add(new Plane(new Vector3(-1, 0, 0), new Vector3(3, 0, 0), new Material(Color.ForestGreen, 0.5f, 0.2f, 0.8f, 4, mScene))); //Right mScene.Objects.Add(new Plane(new Vector3(0, 1, 0), new Vector3(0, -3, 0), new Material(Color.SaddleBrown, 0.5f, 0.2f, 0.8f, 4, mScene))); //Bottom mScene.Lights.Add(new PointLight(new Vector3(1, 2.5f, 1), Color.White, 1f)); mScene.Lights.Add(new PointLight(new Vector3(-1, 2.5f, 1), Color.White, 1f)); mRaytracer = new Raytracer(mCamera, mScene); }
private static async Task Main(string[] args) { await using FileStream fileWriter = File.Open("render.png", FileMode.Create, FileAccess.Write); const float aspectRatio = 16f / 9f; const int imageWidth = 1200; const int imageHeight = (int)(imageWidth / aspectRatio); const int samplesPerPixel = 100; // var interactableObjects = new List<IHitable> // { // new Sphere(new Vector3(0f, 0f, -1f), 0.5f, new Lambertian(new Vector3(0.1f, 0.2f, 0.5f))), // new Sphere(new Vector3(0f, -100.5f, -1f), 100f, new Lambertian(new Vector3(0.8f, 0.8f, 0.0f))), // new Sphere(new Vector3(1f, 0f, -1f), 0.5f, new Metal(new Vector3(0.8f, 0.6f, 0.2f), 0f)), // new Sphere(new Vector3(-1f, 0f, -1f), 0.5f, new Dielectric(1.5f)) // }; // var interactableObjectCollection = new HitableCollection(interactableObjects); IHitable world = CreateRandomScene(); var camPos = new Vector3(13f, 2f, 3f); var camTarget = new Vector3(0f, 0f, 0f); float focusDistance = 10f; float aperture = 0f; var camera = new Camera(camPos, camTarget, new Vector3(0f, 1f, 0f), 20, aspectRatio, aperture, focusDistance); #if DEBUG Console.WriteLine("Hardware acceleration is disabled in Debug mode"); #else Console.WriteLine($"Hardware acceleration: {Vector.IsHardwareAccelerated}"); #endif var raytracer = new Raytracer(imageWidth, imageHeight, samplesPerPixel); using (Image <Rgba32> render = raytracer.Render(camera, world)) { render.SaveAsPng(fileWriter); } }