Quick Comparison
레이 트레이싱은 "모든 조명이 자동으로 좋아지는 옵션"이 아니라, 특정 ray가 장면과 만나는 위치를 가속 구조에서 찾는 방법입니다. 무엇을 ray로 검사할지, 몇 개를 쏠지, 움직인 geometry를 어떻게 갱신할지를 먼저 정해야 합니다.
| 접근 | 가장 잘 쓰는 결과 | 준비 비용 | 반드시 확인할 것 |
|---|---|---|---|
| Rasterization | 기본 visibility와 대량 geometry | draw와 depth target | overdraw, shadow map, screen-space 한계 |
| Ray query | shader 안에서 제한된 가림 또는 반사 검사 | acceleration structure와 feature 지원 | ray 수와 traversal 비용 |
| Ray tracing pipeline | hit/miss shader로 효과를 분리 | shader group, SBT 또는 API별 binding | ray type, recursion/bounce 제한 |
| Path tracing | 다중 bounce의 확률적 조명 | 많은 sample과 denoiser | noise, PDF, temporal history |
교차와 가속 구조
ray origin + direction
-> top-level instance bounds 통과
-> bottom-level mesh bounds 통과
-> triangle intersection
-> closest-hit / any-hit / miss 결과
-> material 또는 다음 ray 계산모든 ray를 모든 triangle과 비교하면 비용이 감당되지 않으므로, 보통 BVH 기반 acceleration structure를 사용합니다. mesh geometry의 triangle을 담는 BLAS와, transform을 가진 instance를 담는 TLAS를 분리하는 구조가 흔합니다. 같은 mesh를 여러 instance가 공유하면 BLAS는 재사용하고 TLAS만 instance transform에 맞춰 갱신할 수 있습니다.
build는 구조를 처음 만드는 작업이고, refit 또는 update는 topology가 유지된 상태에서 bounds를 다시 맞추는 작업입니다. skinned mesh, deforming vertex, instance 수 변동이 큰 군중에서는 update 품질과 build 비용을 각각 측정해야 합니다. 값싼 refit을 계속 쓰면 BVH가 느슨해져 traversal이 더 비싸질 수도 있습니다.
Effect별 설계
| 목표 | ray를 쏘는 위치 | 필요한 입력 | 흔한 제한 |
|---|---|---|---|
| 그림자 | shading point에서 light 방향 | light sample, TLAS | transparent shadow와 alpha mask 정책 |
| 반사 | camera hit에서 반사 방향 | normal, roughness, material | rough reflection은 한 ray만으로 noisy함 |
| AO | surface 주변 반구 | normal, ray length | geometry scale에 민감함 |
| 재질 가시성 | pixel 또는 compute shader | ray query, instance mask | hit shader 없이 무엇을 검사할지 좁혀야 함 |
| path tracing | camera와 각 bounce | BSDF, light PDF, denoiser guide | sample 수와 temporal stability |
hybrid rendering은 rasterization으로 G-buffer, primary visibility, motion vector를 만들고 ray로 reflection, shadow, AO 같은 한두 효과를 보강하는 방식입니다. 이때 raster material의 normal map, alpha mask, instance transform과 ray hit material이 다른 규약을 쓰면 화면의 경계가 맞지 않습니다. ray는 실제 geometry를 보지만 raster가 parallax나 displacement를 별도 처리했다면 두 결과가 완전히 같지 않을 수도 있습니다.
비용과 오류
| 증상 | 먼저 확인할 대상 |
|---|---|
| 움직이는 물체에서 프레임 시간이 튐 | BLAS/TLAS build 또는 update 시간, scratch memory |
| 반사에 다른 object가 비침 | ray mask, instance visibility, material hit group |
| 유리/나뭇잎 그림자가 지나치게 검음 | any-hit, alpha test, transmission 정책 |
| effect가 특정 GPU에서 켜지지 않음 | hardware/API feature와 fallback path |
| noise가 frame마다 흔들림 | ray per pixel, sampling pattern, history validity |
acceleration structure는 frame 안에서 읽기 전에 build/update와 동기화가 끝나야 합니다. 또한 dynamic object를 ray에서 제외하면 비용은 줄지만 반사와 그림자에서만 object가 사라지는 불일치가 생깁니다. raster와 ray의 visible set, material alpha 규칙, transform update 시점을 함께 점검하십시오.
참고 링크
2 sources