added refraction computations to Scene::traceRay()
git-svn-id: svn://anubis/fart/trunk@376 7f9b0f55-74a9-4bce-be96-3c2cd072584d
This commit is contained in:
parent
931cde802e
commit
22f4a79671
@ -119,13 +119,15 @@ void Scene::renderPixel(int x, int y, unsigned char * pixel)
|
|||||||
|
|
||||||
Color Scene::traceRay(const Ray & ray)
|
Color Scene::traceRay(const Ray & ray)
|
||||||
{
|
{
|
||||||
return traceRayRecurse(ray, m_max_depth, 1.0);
|
static refptr<Material> air = new Material();
|
||||||
|
return traceRayRecurse(ray, m_max_depth, 1.0, air);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* factor: the proportion of the final color that this computation is worth
|
* factor: the proportion of the final color that this computation is worth
|
||||||
*/
|
*/
|
||||||
Color Scene::traceRayRecurse(const Ray & ray, int depth, double factor)
|
Color Scene::traceRayRecurse(const Ray & ray, int depth, double factor,
|
||||||
|
refptr<Material> last_material)
|
||||||
{
|
{
|
||||||
Color color;
|
Color color;
|
||||||
|
|
||||||
@ -161,7 +163,8 @@ Color Scene::traceRayRecurse(const Ray & ray, int depth, double factor)
|
|||||||
Ray jitterNewRay(jitter_surface_point, reflected_direction);
|
Ray jitterNewRay(jitter_surface_point, reflected_direction);
|
||||||
Color c = traceRayRecurse(jitterNewRay,
|
Color c = traceRayRecurse(jitterNewRay,
|
||||||
depth - 1,
|
depth - 1,
|
||||||
factor * reflectance);
|
factor * reflectance,
|
||||||
|
material);
|
||||||
color += c * reflectance;
|
color += c * reflectance;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -171,10 +174,15 @@ Color Scene::traceRayRecurse(const Ray & ray, int depth, double factor)
|
|||||||
color *= (1.0 - transparency);
|
color *= (1.0 - transparency);
|
||||||
Vector jitter_surface_point = hit.position
|
Vector jitter_surface_point = hit.position
|
||||||
+ ray.getDirection() * 0.0001;
|
+ ray.getDirection() * 0.0001;
|
||||||
Ray newRay(jitter_surface_point, ray.getDirection());
|
Vector refracted_direction =
|
||||||
|
ray.getDirection().refract(hit.normal,
|
||||||
|
last_material->getRefraction(),
|
||||||
|
material->getRefraction());
|
||||||
|
Ray newRay(jitter_surface_point, refracted_direction);
|
||||||
Color c = traceRayRecurse(newRay,
|
Color c = traceRayRecurse(newRay,
|
||||||
depth - 1,
|
depth - 1,
|
||||||
factor * transparency);
|
factor * transparency,
|
||||||
|
material);
|
||||||
color += c * transparency;
|
color += c * transparency;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -46,7 +46,8 @@ class Scene
|
|||||||
protected:
|
protected:
|
||||||
/* private methods */
|
/* private methods */
|
||||||
Color traceRay(const Ray & ray);
|
Color traceRay(const Ray & ray);
|
||||||
Color traceRayRecurse(const Ray & ray, int depth, double factor);
|
Color traceRayRecurse(const Ray & ray, int depth, double factor,
|
||||||
|
refptr<Material> last_material);
|
||||||
Shape::Intersection getRayClosestHit(const Ray & ray);
|
Shape::Intersection getRayClosestHit(const Ray & ray);
|
||||||
Color computePhong(const refptr<Material> material,
|
Color computePhong(const refptr<Material> material,
|
||||||
const Ray & viewRay,
|
const Ray & viewRay,
|
||||||
|
@ -42,7 +42,11 @@ class Material
|
|||||||
void setReflectance(double reflectance) { m_reflectance = reflectance; }
|
void setReflectance(double reflectance) { m_reflectance = reflectance; }
|
||||||
double getReflectance() const { return m_reflectance; }
|
double getReflectance() const { return m_reflectance; }
|
||||||
|
|
||||||
void setRefraction(double refraction) { m_refraction = refraction; }
|
void setRefraction(double refraction)
|
||||||
|
{
|
||||||
|
if (refraction > 0.0)
|
||||||
|
m_refraction = refraction;
|
||||||
|
}
|
||||||
double getRefraction() const { return m_refraction; }
|
double getRefraction() const { return m_refraction; }
|
||||||
|
|
||||||
void setTransparency(double t) { m_transparency = t; }
|
void setTransparency(double t) { m_transparency = t; }
|
||||||
|
@ -77,7 +77,7 @@ class Vector
|
|||||||
const double sinT2 = n * n * (1.0 - cosI * cosI);
|
const double sinT2 = n * n * (1.0 - cosI * cosI);
|
||||||
if (sinT2 > 1.0)
|
if (sinT2 > 1.0)
|
||||||
return Vector(0.0, 0.0, 0.0);
|
return Vector(0.0, 0.0, 0.0);
|
||||||
return (*this) * n - target * (n + sqrt(1.0 - sinT2));
|
return (*this) * n - target * (n * cosI + sqrt(1.0 - sinT2));
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector getPerpendicular() const
|
Vector getPerpendicular() const
|
||||||
|
Loading…
x
Reference in New Issue
Block a user