예제 #1
0
        static void Main(string[] args)
        {
            Scene scene = new Scene();

            var woodTex = new ImgTexture("wood.png");
            var woodMat = new Phong(woodTex, Vector3.One, 0.2f, 1);

            scene.hitableObjects.Add(Mesh.CreateFromObj("wood2.obj", woodMat));

            var planeTex = new ImgTexture("plane.png");
            var planeMat = new Phong(planeTex, Vector3.One, 1, 10, 0f);

            scene.hitableObjects.Add(Mesh.CreateFromObj("plane.obj", planeMat));

            var appleTex = new ImgTexture("apple.png");
            var phong    = new Phong(appleTex, Vector3.One, 0.2f, 10);

            phong.attenuationType = AttenuationType.None;
            scene.hitableObjects.Add(Mesh.CreateFromObj("apple2.obj", phong));
            //scene.hitableObjects.Add(Mesh.CreateFromObj("apple1.obj", phong));
            //scene.hitableObjects.Add(Mesh.CreateFromObj("apple3.obj", phong));

            scene.clearMaterial = new HDRISkySphere(new ImgTexture("sky.jpg", new Vector2(-0.1f, -0.5f), new Vector2(1, -1)));



            scene.lights.Add(new Light(new Vector3(3, 2, 2), Vector3.One, 1));
            scene.ambientLightInsensity = 0.2f;
            int width  = 400;
            int height = 200;

            //Vector3 lookFrom = new Vector3(1, 0.5f, 1.5f);
            Vector3 lookFrom = new Vector3(1, 1f, 1f);


            Vector3 lookat = new Vector3(0, 0, 0f);
            Camera  camera = new Camera(lookFrom, lookat, Vector3.UnitY, 60, width / height, 0, (lookFrom - lookat).Length());

            camera.hardShadow = true;


            //(scene, camera) = Scene.CreateCornellBoxScene();

            //Render render = new Render(new RayTracingRenderPipeLine(width, height, 500,10));
            Render render = new Render(new EasyPipeLine(width, height, 0));


            render.RenderScene(scene, camera);
            ShowPic(render.SaveRenderedMap($"Render.png"));
        }
예제 #2
0
        public static (Scene, Camera) CreateCornellBoxScene(float fov = 1)
        {
            Scene scene = new Scene();

            scene.clearMaterial = new Lit(Vector3.One);


            //var wallMat = new Lambertian(Vector3.One);
            var wallMat = new Phong(null, Vector3.One, 0.4f, 10);

            wallMat.attenuationType = AttenuationType.Multiply;
            var leftMat = new Phong(null, Vector3.UnitY, 0.5f, 10);

            leftMat.attenuationType = AttenuationType.Multiply;
            var rightMat = new Phong(null, Vector3.UnitX, 0.5f, 10);

            rightMat.attenuationType = AttenuationType.Multiply;

            //下
            scene.hitableObjects.Add(new Fragment(new List <Vector3>()
            {
                new Vector3(10, -10, 10), new Vector3(-10, -10, 10), new Vector3(-10, -10, -10), new Vector3(10, -10, -10)
            }, wallMat));

            scene.hitableObjects.Add(new Fragment(new List <Vector3>()
            {
                new Vector3(10, -10, -10), new Vector3(-10, -10, -10), new Vector3(-10, 10, -10), new Vector3(10, 10, -10)
            }, wallMat));

            //上
            scene.hitableObjects.Add(new Fragment(new List <Vector3>()
            {
                new Vector3(10, 10, 10), new Vector3(-10, 10, 10), new Vector3(-10, 10, -10), new Vector3(10, 10, -10)
            }, wallMat));

            scene.hitableObjects.Add(new Fragment(new List <Vector3>()
            {
                new Vector3(-10, -10, 10), new Vector3(-10, -10, -10), new Vector3(-10, 10, -10), new Vector3(-10, 10, 10)
            }, leftMat));

            scene.hitableObjects.Add(new Fragment(new List <Vector3>()
            {
                new Vector3(10, -10, 10), new Vector3(10, -10, -10), new Vector3(10, 10, -10), new Vector3(10, 10, 10)
            }, rightMat));

            scene.hitableObjects.Add(new Fragment(new List <Vector3>()
            {
                new Vector3(5f, 9.9f, 0f), new Vector3(-5f, 9.9f, 0f), new Vector3(-5f, 9.9f, -3f), new Vector3(5f, 9.9f, -3f)
            },
                                                  new Emission(null, Vector3.One, 15)));

            scene.hitableObjects.Add(new Fragment(new List <Vector3>()
            {
                new Vector3(10, -10, 10f), new Vector3(-10, -10, 10f), new Vector3(-10, 10, 10f), new Vector3(10, 10, 10f)
            }, new Lit(Vector3.One), true, true));



            //背后遮板
            //scene.hitableObjects.Add(new Fragment(new List<Vector3>()
            //{ new Vector3(1000, -1000, 40), new Vector3(-1000, -1000, 40), new Vector3(-1000, 1000, 40), new Vector3(1000, 1000, 40) },
            //    new Lit(Vector3.One)
            //));



            Vector3 lookFrom = new Vector3(0, 0, 37f);
            Vector3 lookat   = new Vector3(0, 0, 0f);
            Camera  camera   = new Camera(lookFrom, lookat, Vector3.UnitY, 40, fov, 0, (lookFrom - lookat).Length());

            //光照
            //scene.lights.Add(new Light(new Vector3(0,9.8f,-1.5f), Vector3.One, 1));
            scene.ambientLightInsensity = 0.2f;


            return(scene, camera);
        }