| 
		  Переменная inv_dir должна содержать 1.0f/ray_dir. 
  
bool RayBoxIntersection(float3 ray_pos, float3 inv_dir, float3 boxMin, float3 boxMax, float& tmin, float& tmax)
{ 
  float lo = inv_dir.x*(boxMin.x - ray_pos.x);
  float hi = inv_dir.x*(boxMax.x - ray_pos.x);
  tmin  = min(lo, hi);
  tmax = max(lo, hi);
  
  float lo1 = inv_dir.y*(boxMin.y - ray_pos.y); 
  float hi1 = inv_dir.y*(boxMax.y - ray_pos.y); 
  tmin  = max(tmin, min(lo1, hi1)); 
  tmax = min(tmax, max(lo1, hi1)); 
  
  float lo2 = inv_dir.z*(boxMin.z - ray_pos.z); 
  float hi2 = inv_dir.z*(boxMax.z - ray_pos.z); 
  tmin  = max(tmin, min(lo2, hi2)); 
  tmax = min(tmax, max(lo2, hi2)); 
  
  return (tmin <= tmax) && (tmax > 0.f); 
} 
  
* В CUDA рекомендуется использовать встроенные функции fminf, fmaxf. 
   |