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));
}
์ด๊ฑฐ ๋ณด๋ฉด์ ์ด์ฌํ ๊ณ ๋ฏผํ๋ฉด์ ์ง๋ดค์
volumetric ๊ตฌ๋ฆ ๋ง๋๋ ค๊ณ
๋๊ธ 0