Exemple #1
0
ColorFloat Shade(Primitive &primitive, int currPrimitiveNum, Ray &ray, float distance, LightSource *lightSources, int numLightSources, Primitive *primitives, int numPrimitives, int depth)
{
  ColorFloat returnColor;
  returnColor.r=0;
  returnColor.g=0;
  returnColor.b=0;
    
  Vector intersection = CalculateIntersection(ray,distance);
    
  Vector normal = CalculateNormal(primitive, intersection);
    
  //specular
  for(int i=0; i<numLightSources; i++)
    {
      Ray rayToLight;
      float distanceToLight = CalculateLightRay(lightSources[i].location, intersection, rayToLight); // sets rayToLight
      float lightCoef = CalculateLightingCoef(IsShadowed(currPrimitiveNum, rayToLight, distanceToLight, primitives, numPrimitives) , rayToLight.direction, normal); 
      returnColor.r += primitive.surface.baseColor.r * lightCoef * lightSources[i].color.r; // try checking first if lightCoef is 0... the check will probably be amortized over the 
      returnColor.g += primitive.surface.baseColor.g * lightCoef * lightSources[i].color.g; // cost of all these multiplications
      returnColor.b += primitive.surface.baseColor.b * lightCoef * lightSources[i].color.b; 
    }
    
  //reflective
  if(primitive.surface.reflectivity!=0)
    {
      ColorFloat reflectedColor = CalculateReflection(ray, intersection, normal, currPrimitiveNum, primitives, numPrimitives, lightSources, numLightSources, depth);
      returnColor.r +=  reflectedColor.r * primitive.surface.reflectivity; 
      returnColor.g +=  reflectedColor.g * primitive.surface.reflectivity; 
      returnColor.b +=  reflectedColor.b * primitive.surface.reflectivity;
    }
    
  return returnColor;
}
Exemple #2
0
void CHardwareBuffer::UpdateFromShadow()
{
	if (!IsShadowed())
		Error("This hardware buffer is not shadowed.");
}