float2 rayBoxDis(float3 bMin, float3 bMax, float3 rayOrigin, float3 rayDir)

{

//๋ฐ•์Šค์˜ 6๋ฉด๊ณผ ๋ ˆ์ด์˜ ๊ต์ 

//rayOrigin + rayDir * a : ๋ ˆ์ด์˜ ๋ ์ 

//x = bMin.x ํ‰๋ฉด๊ณผ์˜ ๊ต์  ๊ตฌํ•˜๊ธฐ

//a์— ์–ด๋–ค ๊ฐ’์ด ๋“ค์–ด๊ฐ”๋”๋‹ˆ, x์ขŒํ‘œ ๊ฐ€ bMin.x(์ƒ์ˆ˜) ๊ฐ€ ๋‚˜์˜ด

//rayOrigin.x + rayDir.x * a = bMin.x

//a = (bMin.x - rayOrigin.x) / rayDir.x


//dir.x๊ฐ€ 0์ธ ๊ฒฝ์šฐ

//origin.x๊ฐ€ bmin.x, bmax.x ์‚ฌ์ด์— ์žˆ์œผ๋ฉด, -๋ฌดํ•œ, ๋ฌดํ•œ ๊ฐ’์ด ๋‚˜์™€์„œ ์ œ๋Œ€๋กœ ์ฒ˜๋ฆฌ ๋จ.

//์‚ฌ์ด์— ์—†๋‹ค๋ฉด -๋ฌดํ•œ, -๋ฌดํ•œ ๋˜๋Š” ๋ฌดํ•œ, ๋ฌดํ•œ์ด ๋‚˜์™€์„œ ์ œ๋Œ€๋กœ ์ฒ˜๋ฆฌ ๋จ


float x0Dis = (bMin.x - rayOrigin.x) / rayDir.x;

float x1Dis = (bMax.x - rayOrigin.x) / rayDir.x;

float y0Dis = (bMin.y - rayOrigin.y) / rayDir.y;

float y1Dis = (bMax.y - rayOrigin.y) / rayDir.y;

float z0Dis = (bMin.z - rayOrigin.z) / rayDir.z;

float z1Dis = (bMax.z - rayOrigin.z) / rayDir.z;


float txMin, txMax;

if (x0Dis < x1Dis)

{

txMin = x0Dis;

txMax = x1Dis;

}

else

{

txMin = x1Dis;

txMax = x0Dis;

}


float tyMin, tyMax;

if (y0Dis < y1Dis)

{

tyMin = y0Dis;

tyMax = y1Dis;

}

else

{

tyMin = y1Dis;

tyMax = y0Dis;

}


float tzMin, tzMax;

if (z0Dis < z1Dis)

{

tzMin = z0Dis;

tzMax = z1Dis;

}

else

{

tzMin = z1Dis;

tzMax = z0Dis;

}


//2D์˜ ๊ฒฝ์šฐ

//() ์•ˆ์˜ ์ˆœ์„œ๋Š” ๋ฌด๊ด€ํ•  ๋•Œ, ๊ต์ฐจํ•˜๋Š” ํ‰๋ฉด์˜ ์ˆœ์„œ๊ฐ€ (xy)(xy)์˜ ํ˜•์‹์ด๋ฉด ๋ฐ˜๋“œ์‹œ ๋‚ด๋ถ€๋ฅผ ์ง€๋‚จ.

//๋‚ด๋ถ€์— ์ ์„ ์ฐ๊ณ  ์•„๋ฌด๋ ‡๊ฒŒ๋‚˜ ์ง์„ ์„ ๊ธ‹๋Š”๋‹ค๊ณ  ์ƒ์ƒํ•˜๋ฉด, ๋ฐ˜๋“œ์‹œ ์ ์„ ๊ธฐ์ค€์— ์™ผ์ชฝ์— (xy)๊ฐ€ ์กด์žฌํ•˜๊ณ  ์˜ค๋ฅธ์ชฝ์—๋„ (xy)๊ฐ€ ์กด์žฌํ•จ


if (txMin > tyMax || txMax < tyMin) return float2(-1,-1);


//3D์˜ ๊ฒฝ์šฐ

//๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋‚ด๋ถ€์— ์ ์„ ์ฐ๊ณ  ์ง์„ ์„ ๊ธ‹๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ํ•ญ์ƒ (xyz)(xyz) ํ˜•์‹์„ ์ทจํ•จ.

//๋‚ด๋ถ€์— ์  (a,b,c)๊ฐ€ ์žˆ์„๋•Œ,

//x0 < a < x1, y0 < b < y1, z0 < c < z1์„ ๋งŒ์กฑ์‹œํ‚ด

//์ง์„ ์„ ๋”ฐ๋ผ ์ด๋™ํ•˜๋ฉด์„œ, a,b,c๋Š” ์ปค์ง€๊ฑฐ๋‚˜ ์ž‘์•„์ง€๊ฑฐ๋‚˜ ์•„๋ฌดํŠผ ํ•œ์ชฝ์œผ๋กœ ์ด๋™ํ•จ.

//๋ฐ˜๋“œ์‹œ x,y,z์—์„œ ํ•œ๋ฒˆ์”ฉ ๊ต์ฐจํ•จ, ๋ฐ˜๋Œ€๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ€๋„ ๋งˆ์ฐฌ๊ฐ€์ง€

//๋ฐ˜๋ฉด์— x0 < a < x1, y0 < b < y1, z0 < c < z1์—์„œ ํ•˜๋‚˜๋ผ๋„ ์–ด๊ธ‹๋‚˜๋ฉด ์  a,b,c ๊ธฐ์ค€์œผ๋กœ ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ํ•  ๋•Œ x๋˜๋Š” y๋˜๋Š” z ํ‰๋ฉด๊ณผ ๋‘๋ฒˆ ๊ต์ฐจํ•จ.


//์œ„์—์„œ ๊ตฌํ•œ xy 2D์˜ ๊ฒฝ์šฐ์—์„œ, ๊ทธ ์ •์ค‘์•™์— z๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ๋“ค์–ด๊ฐ„๋‹ค๋ฉด (xyz)(xyz)๋ฅผ ๋งŒ์กฑํ•˜๊ฒŒ ๋จ.

//xyxy, yxyx, xyyx, yxxy

//(xy)(xy)๋ผ๊ณ  ๋ณผ ๋•Œ, ์•„๋ž˜ (xy)์˜ ์ตœ๋Œ€, ์œ— (xy)์˜ ์ตœ์†Œ์™€ z์˜ ์ตœ์†Œ ์ตœ๋Œ€๋ฅผ ๋น„๊ตํ•˜๋ฉด ๋จ.


float tMin, tMax;

if (txMin > tyMin)

{

tMin = txMin;

}

else

{

tMin = tyMin;

}


if (txMax > tyMax)

{

tMax = tyMax;

}

else

{

tMax = txMax;

}


if (tMin > tzMax || tMax < tzMin) return float2(-1, -1);


//์—ฌ๊ธฐ๊นŒ์ง€ ์™”์œผ๋ฉด ๋ฐ•์Šค์™€ ๋ ˆ์ด๊ฐ€ ๊ต์ฐจํ•˜๋Š”๊ฒŒ ํ™•์‹คํ•จ.

//๊ต์ฐจ์ ์€ ๋ฐ˜๋“œ์‹œ 2๊ฐœ์ด๊ณ  (xyz)(xyz)์—์„œ ์ค‘์•™์˜ ๋‘ ์ ์ž„.

//๊ทธ๋Ÿฌ๋‹ˆ tMin์˜ ์ตœ๋Œ€์™€ tMax์˜ ์ตœ์†Œ


//์—ฌ๊ธฐ์„œ๋Š” tMin๊ณผ tzMax์ค‘ ํฐ ๊ฐ’๊ณผ, tMax์™€ tzMin ์ค‘ ์ž‘์€ ๊ฐ’


float minDis = max(tMin, tzMax);

float maxDis = min(tMax, tzMin);


//minDis๋ณด๋‹ค maxDis๊ฐ€ ํ•ญ์ƒ ํผ

//minDis < 0 < maxDis ๋ฉด ๋ฐ•์Šค ๋‚ด๋ถ€๊ฐ€ ๋ ˆ์ด์˜ ์‹œ์ž‘์ 

//minDis < maxDis < 0 ๋ฐ•์Šค๋ฅผ ์ง€๋‚˜์นœ ์œ„์น˜๊ฐ€ ๋ ˆ์ด์˜ ์‹œ์ž‘์ 

//0 < minDis < maxDis๋ฉด ๋ฐ•์Šค์™€ ๋งŒ๋‚˜๊ธฐ ์ „์˜ ์œ„์น˜๊ฐ€ ๋ ˆ์ด์˜ ์‹œ์ž‘์ 


return float2(max(tMin, tzMax), min(tMax, tzMin));

}


https://www.scratchapixel.com/lessons/3d-basic-rendering/minimal-ray-tracer-rendering-simple-shapes/ray-box-intersection


์ด๊ฑฐ ๋ณด๋ฉด์„œ ์—ด์‹ฌํžˆ ๊ณ ๋ฏผํ•˜๋ฉด์„œ ์งœ๋ดค์Œ

volumetric ๊ตฌ๋ฆ„ ๋งŒ๋“œ๋ ค๊ณ