Пример #1
0
void IsotropicPhongSPF::Scatter( 
	const RayIntersectionGeometric& ri,							///< [in] Geometric intersection details for point of intersection
	const RandomNumberGenerator& random,				///< [in] Random number generator
	ScatteredRayContainer& scattered,							///< [out] The list of scattered rays from the surface
	const IORStack* const ior_stack								///< [in/out] Index of refraction stack
	) const
{
	const Scalar rdotn = Vector3Ops::Dot(ri.ray.dir, ri.vNormal);
	const Vector3 n = rdotn > 0 ? -ri.onb.w() : ri.onb.w();
	const Vector3 reflected = Optics::CalculateReflectedRay( ri.ray.dir, n );

	const RISEPel N = exponent.GetColor(ri);

	ScatteredRay diffuse, specular;	
	GenerateDiffuseRay( diffuse, rdotn, ri,  Point2( random.CanonicalRandom(), random.CanonicalRandom() ) );

	if( N[0] == N[1] && N[1] == N[2] ) {
		GenerateSpecularRay( specular, n, reflected, ri,  Point2( random.CanonicalRandom(), random.CanonicalRandom() ), N[0] );
		specular.kray = Rs.GetColor(ri);
		scattered.AddScatteredRay( specular );
	} else {
		const RISEPel spec = Rs.GetColor(ri);
		const Point2 ptrand( random.CanonicalRandom(), random.CanonicalRandom() );
		for( int i=0; i<3; i++ ) {
			GenerateSpecularRay( specular, n, reflected, ri,  ptrand, N[i] );
			specular.kray = 0.0;
			specular.kray[i] = spec[i];
			scattered.AddScatteredRay( specular );
		}
	}
	
	diffuse.kray = Rd.GetColor(ri);
	scattered.AddScatteredRay( diffuse );
}
Пример #2
0
void IsotropicPhongSPF::ScatterNM( 
	const RayIntersectionGeometric& ri,							///< [in] Geometric intersection details for point of intersection
	const RandomNumberGenerator& random,				///< [in] Random number generator
	const Scalar nm,											///< [in] Wavelength the material is to consider (only used for spectral processing)
	ScatteredRayContainer& scattered,							///< [out] The list of scattered rays from the surface
	const IORStack* const ior_stack								///< [in/out] Index of refraction stack
	) const
{
	const Scalar rdotn = Vector3Ops::Dot(ri.ray.dir, ri.vNormal);
	const Vector3 n = rdotn > 0 ? -ri.onb.w() : ri.onb.w();
	const Vector3 reflected = Optics::CalculateReflectedRay( ri.ray.dir, n );

	ScatteredRay diffuse, specular;	
	GenerateDiffuseRay( diffuse, rdotn, ri,  Point2( random.CanonicalRandom(), random.CanonicalRandom() ) );
	GenerateSpecularRay( specular, n, reflected, ri,  Point2( random.CanonicalRandom(), random.CanonicalRandom() ),  exponent.GetColorNM(ri,nm) );

	diffuse.krayNM = Rd.GetColorNM(ri,nm);
	specular.krayNM = Rs.GetColorNM(ri,nm);
	
	scattered.AddScatteredRay( diffuse );
	scattered.AddScatteredRay( specular );
}