1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| #include "rtweekend.h"
#include "camera.h" #include "hittable.h" #include "hittable_list.h" #include "material.h" #include "sphere.h"
int main(){ hittable_list world;
auto ground_material = make_shared<lambertian>(color(0.5,0.5,0.5)); world.add(make_shared<sphere>(point3(0,-1000,0),1000,ground_material));
for(int a = -11;a < 11;a++){ for(int b = -11;b < 11;b++){ auto choose_mat = random_double(); point3 center(a + 0.9*random_double(), 0.2, b + 0.9*random_double());
if((center - point3(4,0.2,0)).length() > 1.0){ shared_ptr<material> sphere_material;
if(choose_mat < 0.8){ auto albedo = color::random() * color::random(); sphere_material = make_shared<lambertian>(albedo); world.add(make_shared<sphere>(center,0.2,sphere_material)); }else if(choose_mat < 0.95) { auto albedo = color::random(0.5,1); auto fuzz = random_double(0,0.5); sphere_material = make_shared<metal>(albedo,fuzz); world.add(make_shared<sphere>(center,0.2,sphere_material)); }else{ sphere_material = make_shared<dielectric>(1.5); world.add(make_shared<sphere>(center,0.2,sphere_material)); } } } }
auto material1 = make_shared<dielectric>(1.5); world.add(make_shared<sphere>(point3(0,1,0),1.0,material1));
auto material2 = make_shared<lambertian>(color(0.4, 0.2, 0.1)); world.add(make_shared<sphere>(point3(-4, 1, 0), 1.0, material2));
auto material3 = make_shared<metal>(color(0.7, 0.6, 0.5), 0.0); world.add(make_shared<sphere>(point3(4, 1, 0), 1.0, material3));
camera cam;
cam.aspect_ratio = 16.0 / 9.0; cam.image_width = 800; cam.samples_per_pixel = 100; cam.max_depth = 50;
cam.vfov = 20; cam.lookfrom = point3(13,2,3); cam.lookat = point3(0,0,0); cam.vup = vec3(0,1,0);
cam.defocus_angle = 0.6; cam.focus_dist = 10.0;
cam.render(world); }
|