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")); }
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); }