Пример #1
0
int Scene::render() {
	RayTracer raytracer;
	Camera camera(options);
	Film film(options);
	Sampler sampler(options);
	Sample sample;
	Ray ray;
	Color color;
	while(sampler.generate_sample(sample)) {
		camera.generate_ray(sample, ray);
		raytracer.trace(options, ray, color, options.maxdepth);
		film.commit(sample, color);
	}
	return film.write_image();
};
Пример #2
0
void* rayThread(void* argument)
{
    float r = 10.0f;
    mvl::GVector3f center(0.0f, 0.0f, -15.0f);
	std::shared_ptr<IlluminatedObject> sphereA(new Sphere (center, r));
    sphereA->setColor(mvl::GVector4f(1.0f, 0.85f, 0.73f, 1.0f));
    sphereA->setDiffAmbCoeff(1.0);
    sphereA->setReflCoeff(0.0);
    //sphereA.setDiffAmbCoeff(.8);
    //sphereA.setReflCoeff(0.4);
    
    r = 7.0f;
    center = mvl::GVector3f(-15.0f, -3.0f, -3.0f);
    std::shared_ptr<IlluminatedObject> sphereB(new Sphere(center, r));
    sphereB->setColor(mvl::GVector4f(1.0f, 1.0f, 0.6f, 1.0f));
    sphereB->setDiffAmbCoeff(0.8f);
    sphereB->setReflCoeff(0.1f);
    
    r = 14.0f;
    center = mvl::GVector3f(20.0f, 4.0f, 0.0f);
    std::shared_ptr<IlluminatedObject> sphereL(new Sphere(center, r));
    sphereL->setColor(mvl::GVector4f(1.0f, 0.079f, 0.57f, 1.0f));
    sphereL->setReflCoeff(0.0f);
    
    mvl::GVector3f p0(-30.0f, 10.0f, -15.0f);
    mvl::GVector3f p1(-7.0f, 10.0f, -20.0f);
    mvl::GVector3f p2(-20.0f, 25.0f, -8.5f);
    std::shared_ptr<IlluminatedObject>triangle(new RTriangle (p0, p1, p2));
    triangle->setDiffAmbCoeff(0.2f);
    triangle->setReflCoeff(1.0f);
    
    //Plane plane(mvl::GVector4f(0.0f, 0.0f, -100.0f, 1.0f), mvl::GVector4f(0.0f, 0.707f, 0.707f, 1.0f));
    std::shared_ptr<IlluminatedObject>table(new Plane(mvl::GVector3f(0.0f, -10.0f, 0.0f), mvl::GVector3f(0.0f, 1.0f, 0.1f)));
    table->setColor(mvl::GVector4f(1.0f, 1.0f, 1.0f, 1.0f));
    table->setReflCoeff(.2);
    
    std::shared_ptr<IlluminatedObject>backWall(new Plane(mvl::GVector3f(0.0f, -10.0f, -50.0f), mvl::GVector3f(0.0f, 0.0f, 1.0f)));
    backWall->setColor(mvl::GVector4f(0.67f, 0.84f, 0.90f, 1.0f));
    backWall->setReflCoeff(.2);    
    
    Plane frontWall(mvl::GVector3f(0.0f, -10.0f, 100.0f), mvl::GVector3f(0.0f, 0.0f, -1.0f));
    frontWall.setColor(mvl::GVector4f(0.5f, 1.0f, 0.5f, 1.0f));
    frontWall.setReflCoeff(.2);    
    
    Plane ceilingWall(mvl::GVector3f(0.0f, 40.0f, 100.0f), mvl::GVector3f(0.0f, -1.0f, 0.0f));
    ceilingWall.setColor(mvl::GVector4f(1.0f, 0.0f, 0.0f, 1.0f));
    ceilingWall.setReflCoeff(.2);     
    
    LambertLight light0;
    //light.setPos(mvl::GVector4f(0.0f, 0.0f, 10.0f, 1.0f));
    light0.setPos(mvl::GVector3f(-20.0f, 20.0f, 100.0f));
    light0.setDiffuse(mvl::GVector4f(0.75f, 0.75f, 0.6f, 1.0f));
    light0.setAmbient(mvl::GVector4f(0.01f, 0.01f, 0.01f, 1.0f));
    
    LambertLight light1;
    light1.setPos(mvl::GVector3f(20.0f, 20.0f, 100.0f));
    //light2.setPos(mvl::GVector4f(0.0f, 0.0f, -500.0f, 1.0f));
    light1.setDiffuse(mvl::GVector4f(0.5f, 0.5f, 0.4f, 1.0f));
    light1.setAmbient(mvl::GVector4f(0.01f, 0.01f, 0.01f, 1.0f));
    
    Scene scene;
    scene.addObject(sphereA);
    scene.addObject(sphereB);
    scene.addObject(sphereL);
    scene.addObject(table);
    scene.addObject(triangle);
    scene.addObject(backWall);
    //scene.addObject(&frontWall);
    //scene.addObject(&ceilingWall);
    scene.addLight(&light0);
    scene.addLight(&light1);    
    
    rayTracer.trace(scene);
    return NULL;
}