 	const aten::ray& r,
 	aten::Intersection* isect)
 {
-	int exid = -1;
-	int shapeid = -1;
-
 	float t_min = AT_MATH_EPSILON;
 	float t_max = AT_MATH_INF;
 
+	BVHCandidate candidates[STACK_SIZE];
+	int candidateNum = 0;
+
 	bool isHit = intersectBVH(
 		ctxt->nodes[0],
-		&exid,
-		&shapeid,
+		candidates, candidateNum,
 		ctxt,
 		r,
 		t_min, t_max,
 		isect);
 
-	if (exid >= 0) {
+	for (int i = 0; i < candidateNum; i++) {
+		const auto& c = candidates[i];
+
 		aten::Intersection isectTmp;
 
-		const auto& param = ctxt->shapes[shapeid];
+		const auto& param = ctxt->shapes[c.shapeid];
 
 		auto mtxW2L = ctxt->matrices[param.mtxid * 2 + 1];
 

						isectTmp.mtrlid = s->mtrl.idx;
					}

					if (isectTmp.t < hitt) {
						hitt = isectTmp.t;
						*exid = tmpexid;
						*shapeid = tmpshapeid;

						if (tmpshapeid >= 0 && type == IntersectType::Closer) {
							return false;
						}
					}
					if (tmpexid < 0) {

		transformedRay.dir = mtxW2L.applyXYZ(r.dir);
		transformedRay.dir = normalize(transformedRay.dir);

		if (intersectBVH(ctxt->nodes[c.exid], ctxt, transformedRay, t_min, t_max, &isectTmp, IntersectType::Closer)) {
			if (isectTmp.t < isect->t) {
				*isect = isectTmp;
				isHit = true;
