Shadow 구현 방법
눈의 지점 Eye의 Point로부터 픽셀을 지나 물체로 향하는 벡터를 Primary ray라고 합니다.
primary ray가 충돌한 물체의 위치를 P라고 할 때, P에서 빛의 위치로 향하는 벡터를 Shadow ray라고 합니다.
Shadow ray를 다시 쏴줌으로써 빛을 받는 위치에서 다른 물체와의 충돌 여부를 체크해서 가려지는지 여부를 판별할 수 있습니다.
이 포스팅에서는 빛의 대한 충돌 구현 방법은 적지 않으니 충돌 체크에 대한 방법론은 아래 레퍼런스를 참고하시길 바랍니다.
Code
픽셀로부터 발사된 Ray의 충돌 지점을 통해 빛의 방향으로 Ray를 다시 쏘아서 충돌 체크를 한 후 만약 물체가 가로막고 있다면 해당 픽셀을 그림자가 맺히도록 검은색 픽셀로 그려주도록 하는 코드 입니다.
Ray shadowRay{ hit.point + dirToLight * 1e-4f, dirToLight };
Shadow ray는 픽셀로 부터의 광선의 충돌 지점에서 빛 방향으로 향하는 Ray입니다.
주의할 점
여기서 충돌 지점에서 바로 사용하게 되면 컴퓨터의 수치해석 문제로 인해 바로 충돌 처리가 되어버리는 버그가 생길 수 있으므로, Shadow ray가 향하고자 하는 방향으로 primary ray를 아주 미세한 수치만큼 이동시켜주는 것이 중요합니다.
Reference:
https://jmhongus2019.wixsite.com/mysite
'Graphics & DirectX' 카테고리의 다른 글
[Graphics] Bloom (shader effect) (0) | 2023.05.07 |
---|---|
[Graphics] Separable convolution (0) | 2023.05.05 |