Переменная 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.
|