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");
            }
        }
Exemple #2
0
        static void Main(string[] args)
        {
            Scene     scene     = new Scene();
            Raytracer raytracer = new Raytracer(scene);

            raytracer.OutputFile("..\\..\\result.ppm", 1920, 1080);
            Console.ReadLine();
        }
Exemple #3
0
        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);
        }
Exemple #4
0
        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);
            }
        }