Account all types of rays -- print them at the end
This commit is contained in:
		
							parent
							
								
									c65c6a3cfd
								
							
						
					
					
						commit
						0d2011931c
					
				
					 2 changed files with 69 additions and 13 deletions
				
			
		
							
								
								
									
										65
									
								
								src/scene.cc
									
										
									
									
									
								
							
							
						
						
									
										65
									
								
								src/scene.cc
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -24,7 +24,7 @@ Scene::Scene()
 | 
			
		|||
      ambient(new AmbientLight()),
 | 
			
		||||
      shapes(),
 | 
			
		||||
      lights(),
 | 
			
		||||
      nrays(0),
 | 
			
		||||
      mStats(),
 | 
			
		||||
      pixels(NULL)
 | 
			
		||||
{ }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -155,6 +155,7 @@ Scene::render()
 | 
			
		|||
    for (int y = 0; y < height; y++) {
 | 
			
		||||
        for (int x = 0; x < width; x++) {
 | 
			
		||||
            primary_ray = mCamera->compute_primary_ray(x, width, y, height);
 | 
			
		||||
            mStats.primaryRays++;
 | 
			
		||||
            Color c = trace_ray(primary_ray);
 | 
			
		||||
            pixels[y * width + x] = c;
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -164,7 +165,9 @@ Scene::render()
 | 
			
		|||
    std::chrono::duration<float> seconds = end - start;
 | 
			
		||||
 | 
			
		||||
    _is_rendered = true;
 | 
			
		||||
    printf("Scene rendered. %d rays traced in %f seconds.\n", nrays, seconds.count());
 | 
			
		||||
 | 
			
		||||
    printf("Rendering completed in %f seconds.\n\n", seconds.count());
 | 
			
		||||
    mStats.PrintRayTable();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -212,9 +215,6 @@ Scene::trace_ray(const Ray &ray,
 | 
			
		|||
    float nearest_t = INFINITY;
 | 
			
		||||
    int nints;
 | 
			
		||||
 | 
			
		||||
    // Keep stats.
 | 
			
		||||
    nrays++;
 | 
			
		||||
 | 
			
		||||
    // Find intersections of this ray with objects in the scene.
 | 
			
		||||
    for (Shape *s : shapes) {
 | 
			
		||||
        nints = s->does_intersect(ray, &t);
 | 
			
		||||
| 
						 | 
				
			
			@ -269,6 +269,8 @@ Scene::trace_ray(const Ray &ray,
 | 
			
		|||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            mStats.shadowRays++;
 | 
			
		||||
 | 
			
		||||
            // Figure out if we're in shadow.
 | 
			
		||||
            if (s->does_intersect(shadow_ray, NULL) > 0) {
 | 
			
		||||
                diffuse_level = 0.0;
 | 
			
		||||
| 
						 | 
				
			
			@ -291,20 +293,61 @@ Scene::trace_ray(const Ray &ray,
 | 
			
		|||
    const Color &specular_color = shape_material->get_specular_color();
 | 
			
		||||
 | 
			
		||||
    /*
 | 
			
		||||
     * Compute the reflection ray. Computing the direction of the reflection ray is done by the following formula:
 | 
			
		||||
     * Compute the reflection ray. Computing the direction of the reflection ray
 | 
			
		||||
     * is done by the following formula:
 | 
			
		||||
     *
 | 
			
		||||
     *     d = dr - 2n(dr . n)
 | 
			
		||||
     *
 | 
			
		||||
     * where d is the direction, dr is the direction of the incoming ray, and n is the normal vector. Period (.)
 | 
			
		||||
     * indicates the dot product.
 | 
			
		||||
     * where d is the direction, dr is the direction of the incoming ray, and n
 | 
			
		||||
     * is the normal vector. Period (.) indicates the dot product.
 | 
			
		||||
     *
 | 
			
		||||
     * The origin of the reflection ray is the point on the surface where the incoming ray intersected with it.
 | 
			
		||||
     * The origin of the reflection ray is the point on the surface where the
 | 
			
		||||
     * incoming ray intersected with it.
 | 
			
		||||
     */
 | 
			
		||||
    Ray reflection_ray = Ray(intersection, ray.direction - 2.0 * normal * ray.direction.dot(normal));
 | 
			
		||||
    Color reflection_color = trace_ray(reflection_ray, depth + 1, weight * specular_level);
 | 
			
		||||
    Ray reflection_ray = Ray(intersection,
 | 
			
		||||
                             ray.direction - 2.0 * normal * ray.direction.dot(normal));
 | 
			
		||||
    mStats.reflectionRays++;
 | 
			
		||||
    Color reflection_color = trace_ray(reflection_ray,
 | 
			
		||||
                                       depth + 1,
 | 
			
		||||
                                       weight * specular_level);
 | 
			
		||||
 | 
			
		||||
    // TODO: Mix in specular_color of material.
 | 
			
		||||
    out_color += specular_level * specular_color * reflection_color;
 | 
			
		||||
 | 
			
		||||
    return out_color;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
unsigned long
 | 
			
		||||
Scene::Stats::TotalRays()
 | 
			
		||||
    const
 | 
			
		||||
{
 | 
			
		||||
    return primaryRays + shadowRays + reflectionRays + transmissionRays;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
Scene::Stats::PrintRayTable()
 | 
			
		||||
    const
 | 
			
		||||
{
 | 
			
		||||
    printf("RAY TYPE              NUM      %%\n");
 | 
			
		||||
    printf("-------------- ---------- ------\n");
 | 
			
		||||
    PrintRayRow("primary", primaryRays);
 | 
			
		||||
    PrintRayRow("shadow", shadowRays);
 | 
			
		||||
    PrintRayRow("reflection", reflectionRays);
 | 
			
		||||
    PrintRayRow("transmission", transmissionRays);
 | 
			
		||||
    PrintRayRow("total", TotalRays());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
Scene::Stats::PrintRayRow(const std::string& title,
 | 
			
		||||
                          const unsigned long& value)
 | 
			
		||||
    const
 | 
			
		||||
{
 | 
			
		||||
    double totalRays = TotalRays();
 | 
			
		||||
    printf("%-14s %10ld %#5.1lf%%\n",
 | 
			
		||||
           title.c_str(),
 | 
			
		||||
           value,
 | 
			
		||||
           double(value) / totalRays * 100.0);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										17
									
								
								src/scene.h
									
										
									
									
									
								
							
							
						
						
									
										17
									
								
								src/scene.h
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -38,7 +38,6 @@ public:
 | 
			
		|||
 | 
			
		||||
    Camera::Ptr GetCamera() const;
 | 
			
		||||
    void SetCamera(Camera* camera);
 | 
			
		||||
    void SetCamera(Camera::Ptr camera);
 | 
			
		||||
 | 
			
		||||
    AmbientLight &get_ambient() const;
 | 
			
		||||
    const Color *get_pixels() const;
 | 
			
		||||
| 
						 | 
				
			
			@ -71,7 +70,21 @@ private:
 | 
			
		|||
    std::list<PointLight *> lights;
 | 
			
		||||
 | 
			
		||||
    // Rendering stats
 | 
			
		||||
    unsigned int nrays;
 | 
			
		||||
    struct Stats
 | 
			
		||||
    {
 | 
			
		||||
        unsigned long TotalRays() const;
 | 
			
		||||
 | 
			
		||||
        void PrintRayTable() const;
 | 
			
		||||
 | 
			
		||||
        unsigned long primaryRays;
 | 
			
		||||
        unsigned long shadowRays;
 | 
			
		||||
        unsigned long reflectionRays;
 | 
			
		||||
        unsigned long transmissionRays;
 | 
			
		||||
 | 
			
		||||
    private:
 | 
			
		||||
        void PrintRayRow(const std::string& title,
 | 
			
		||||
                         const unsigned long& value) const;
 | 
			
		||||
    } mStats;
 | 
			
		||||
 | 
			
		||||
    // Rendering output.
 | 
			
		||||
    bool _is_rendered;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue