public Scene(List<Mesh> meshes, List<LightSource> lightSources, Camera camera, Color skyColor) { _meshes = meshes; LightSources = lightSources; _camera = camera; _skyColor = Vector3.FromColor(skyColor); }
private void backgroundWorker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) { Size s = m_lstBmp[m_iCurRendering].Size; Camera cam = new Camera(new Vector3(5, 2, 6), new Vector3(-1, .5, 0), s.Width, s.Height); long lastUpdate = 0; int cnt = 0; Stopwatch sw = Stopwatch.StartNew(); backgroundWorker.ReportProgress(0); Visual vis = e.Argument as Visual; if (null == vis) return; vis.renderImage(InputScene.Scene1, cam, (int x, int y, Color color) => { if (backgroundWorker.CancellationPending) return; lock (m_quePixel) { m_quePixel.Enqueue(new Pixel(x, y, ToDrawingColor(color))); } Interlocked.Increment(ref cnt); long time = sw.ElapsedMilliseconds; if (lastUpdate + 100 < time) { lastUpdate = time; backgroundWorker.ReportProgress(cnt * 100 / (s.Width * s.Height)); } } ); backgroundWorker.ReportProgress(100, sw.ElapsedMilliseconds); }
public static Scene GeometricFiguresBox() { var cameraPosition = new Vector3(0, 8, 5); var camera = new Camera(cameraPosition, Quaternion.LookRotation(new Vector3(0, -1, -1), Vector3.Up), 8.0f / 6.0f, (float)Math.PI * 60f / 180f); ISampler smooth = new InterpolatedNormalSampler(); ISampler flat = new FlatNormalSampler(); Shader diffuseRedSmooth = new DiffuseShader(new SolidColorSampler(Color.Red)); Shader diffuseSilver = new DiffuseShader(new SolidColorSampler(Color.Silver)); Shader diffuseWhite = new DiffuseShader(new SolidColorSampler(Color.White)); Shader diffuseGreenSmooth = new DiffuseShader(new SolidColorSampler(Color.Green)); Shader glossy = new GlossyShader(); Shader mirror = new MixShader(diffuseSilver, glossy, 0.6f); Shader cubeShader = new MixShader(diffuseWhite, glossy, 0.6f); Shader smallSphereShader = new MixShader(diffuseGreenSmooth, glossy, 0.4f); Mesh sphere = TriangleSphere.Create( new Vector3(3, 2, -6), Quaternion.Identity, 2, 32, 40, diffuseRedSmooth, smooth); Mesh smallSphere = TriangleSphere.Create( new Vector3(-2, 1, -4), Quaternion.Identity, 1, 26, 20, smallSphereShader, smooth); Mesh cube = Cube.Create( new Vector3(-2.9f, 1.5f, -8), new Quaternion(0, 1, 0, 0.33f).Normalized(), 3, cubeShader, flat); Mesh backWall = Plane.Create( new Vector3(0, 0, -10), Quaternion.Identity, Vector3.Down, Vector3.Right, 100, diffuseSilver, flat); Mesh frontWall = Plane.Create( new Vector3(0, 0, 6), Quaternion.Identity, Vector3.Up, Vector3.Right, 100, diffuseSilver, flat); Mesh floor = Plane.Create( new Vector3(0, 0, 0), Quaternion.Identity, Vector3.Forward, Vector3.Right, 100, diffuseSilver, flat); Mesh ceiling = Plane.Create( new Vector3(0, 10, 0), Quaternion.Identity, Vector3.Forward, Vector3.Left, 100, diffuseSilver, flat); Mesh leftWall = Plane.Create( new Vector3(-5, 0, 0), Quaternion.Identity, Vector3.Forward, Vector3.Down, 100, mirror, flat); Mesh rightWall = Plane.Create( new Vector3(5, 0, 0), Quaternion.Identity, Vector3.Forward, Vector3.Up, 100, mirror, flat); var meshes = new List<Mesh> { cube, sphere, smallSphere, backWall, frontWall, floor, ceiling, leftWall, rightWall }; LightSource cameraLightSource = new PointLight(cameraPosition, 3, 10, Color.White); var lightSources = new List<LightSource> { new PointLight(new Vector3(-4.5f, 7.5f, -9.5f), 2.0f, 5, Color.White), new PointLight(new Vector3(4.5f, 7.5f, -9.5f), 2.0f, 5, Color.White), cameraLightSource }; return new Scene(meshes, lightSources, camera, Color.White); }
public void renderImage(Scene scene, Camera cam, Action<int, int, Color> setPixel) { PointF[] pixels = createPoints(cam.ViewportWidth, cam.ViewportHeight); pixels.Shuffle(); foreach (PointF pixel in pixels) { Color color = renderPixel(scene, cam, pixel.X, pixel.Y); setPixel(Convert.ToInt32(pixel.X), Convert.ToInt32(pixel.Y), color); } }
public static Scene Spheres() { var cameraPosition = new Vector3(0, 1, 0); var camera = new Camera(cameraPosition, Quaternion.Identity, 8.0f / 6.0f, (float)Math.PI * 80f / 180f); ISampler smoothSampler = new InterpolatedNormalSampler(); ISampler flatSampler = new FlatNormalSampler(); Shader grayDiffuse = new DiffuseShader(new SolidColorSampler(Color.DarkSlateGray)); Shader glossyShader = new GlossyShader(); Shader floorShader = new MixShader(grayDiffuse, glossyShader, 0.8f); Mesh floor = Plane.Create(Vector3.Zero, Quaternion.Identity, Vector3.Forward, Vector3.Right, 100, floorShader, flatSampler); var meshes = new List<Mesh> { floor }; var radiuses = new List<double> {1, 0.2, 1, 4, 1.1, 0.6, 0.9}; var positions = new List<Vector2> { new Vector2(-6, 5), new Vector2(-0.2f, 2), new Vector2(-2f, 3.6f), new Vector2(-1f, 14), new Vector2(2, 3), new Vector2(0.7f, 2.5f), new Vector2(6, 13) }; var colors = new List<Color> { Color.Green, Color.LightSeaGreen, Color.DarkOrange, Color.Orchid, Color.Blue, Color.White, Color.DarkViolet }; for (int i = 0; i < 7; i++) { Shader shader = new MixShader(new DiffuseShader(new SolidColorSampler(colors[i])), new GlossyShader(), 0.7f); meshes.Add( TriangleSphere.Create( new Vector3(positions[i].x, (float) radiuses[i], positions[i].y), Quaternion.Identity, radiuses[i], 16, 16, shader, smoothSampler)); } var lights = new List<LightSource> { new DirectionalLight(2, Color.White, new Vector3(0.3f, -1f, 0.3f)), new PointLight(cameraPosition, 1, 10, Color.White) }; return new Scene(meshes, lights, camera, Color.Black); }
public Color renderPixel(Scene scene, Camera cam, float x_, float y_) { if (1 == m_iMultiSamples) { return RayTracer.TraceRay(cam.Pos, cam.PerspectiveRayDir(x_, y_), scene, 0); } Color color = Color.Black(); float delta = 1.0f / ((float)Math.Sqrt(m_iMultiSamples)); int count = 0; for (float x = x_ - 0.5f; x < x_ + 0.5f; x += delta) { for (float y = y_ - 0.5f; y < y_ + 0.5f; y += delta) { color += RayTracer.TraceRay(cam.Pos, cam.PerspectiveRayDir(x, y), scene, 0); ++count; } } return color * (1.0f / m_iMultiSamples); }
public Raytracer() { camEye = new Camera(0, 0, 200, 0, 0, 0, 0, 1, 0); }
private void pictureBox_MouseClick(object sender, MouseEventArgs e) { updateImage(); Bitmap bitmap = pictureBox.Image as Bitmap; if (null == bitmap) return; Camera cam = new Camera(new Vector3(5, 2, 6), new Vector3(-1, .5, 0), bitmap.Width, bitmap.Height); Color color = createVisual().renderPixel(InputScene.Scene1, cam, e.X, e.Y); bitmap.SetPixel(e.X,e.Y, ToDrawingColor(color)); }