[고도엔진 내부 쉐이더 공부] Ray Marching 기법을 통한 그림자 쉐이더 처리 - Whitmem
[고도엔진 내부 쉐이더 공부] Ray Marching 기법을 통한 그림자 쉐이더 처리
Game Development
2025-01-24 23:00 게시 53eff26a44da7cb793dd

0
0
68
이 페이지는 외부 공간에 무단 복제할 수 없으며 오직 있는 그대로 게시되며 부정확한 내용을 포함할 수 있습니다. 법률이 허용하는 한 가이드 라인에 맞춰 게시 내용을 인용하거나 출처로 표기할 수 있습니다.
This page is not to be distributed to external services; it is provided as is and may contain inaccuracies.
Ray marching 기법을 통한 그림자 구현의 방법 및 쉐이딩 처리 원리
이 게시글에서는 Ray Marching 을 활용하여 그림자 구현 및 처리하는 방법에 대해서 알아보기로 한다.
https://en.wikipedia.org/wiki/Ray_marching
기본적으로 2D 에서 그림자 처리를 수행하기 위해서는 빛이 이동하면서 해당 빛이 어떤 물체와 부딪혔는지 확인하는 과정을 거친다. 어떤 지점에 빛이 표면 지점부터 빛까지 이동할 때 중간에 어떤 물체가 가로 막고 있으면 해당 지점은 그림자 렌더링하면 되는 것이다.
원본 렌더링 결과는 위와 같다.
원본 렌더링을 처리하기 위한 월드 공간은 위와 같다. 이러한 씬을 하나 만들고, 레이어 마스크는 배경은 레이어 1 에만 렌더링하고, 나머지는 1,2 레이어를 활성화한다.
배경 레이어는 Ray Marching 의 대상이 되면 안되기 때문에 이를 별개로 렌더링해야 하는 것이다. 즉 실제 객체는 레이어 2에도 렌더링되는 것인데, 레이어 2는 실제 객체의 텍스처를 가져오는 데만 사용한다.
실제 렌더링 되는 영역에서 뷰 포트 2개를 만들고 각 뷰 포트에 동일한 장면을 드래그해서 넣는다. 물론 위와 같이 하면 인스턴스가 별개 생성되기 때문에 실제 사용 용도로는 적합하지 않다. 그러나 우선 쉐이더 구현이 주요 목표이기 때문에 이는 간단하게 패스한다. 뷰포트 크기는 두개를 동일하게 맞춰야 한다. 텍스처를 서로 가져다 쓸 것이기 때문이다. VP1은 Cull mode 레이어 1를 체크하여 전체가 렌더링되게끔 하고, VP2는 Cull mode 레이어 2를 체크하여 배경을 제외한 객체만 렌더링하게끔 한다.
그리고 TextureRect 의 메인 텍스처에는 전체가 렌더링되는 VP 1을 선택하여 전체를 렌더링한다.
그리고 TextureRect 에서 쉐이더를 생성하고, uniform sampler2D shadow를 받아 해당 쉐이더에는 VP2 의 뷰포트 텍스처를 입력한다. 즉 shadow 맵에는 실제 객체만 존재하는 텍스처를 입력받는 것이다.
그리고 쉐이더 안에 임의로 빛 위치를 지정한다. 월드 공간으로 지정하는 것이 맞겠으나, 쉐이더에서 잠시 테스트하기 위해서 UV 좌표를 기준으로 기록하였다. 기본 빛의 밝기 velocity는 빛의 밝기를 지정한다. lastDistance 는 ray marching을 수행하면서 빛과의 거리를 의미한다. 빛과의 거리가 갑자기 멀어지기 시작하면, Ray Marching을 즉시 중단하기 위해 사용하는 것이다.
만약, 이러한 lastDistance 처리를 하지 않는 경우 빛이 없어야 할 부분까지 빛이 생기는 문제가 발생한다.
RayMarching 기법은, 빛이 그려지는 부분에서 빛이 존재하는 지점까지 임의 길이 만큼 반복하면서 Ray Marching 을 수행하는데, 빛이 존재하는 지점까지만 장애물이 존재하는지 확인해야 한다. 즉 Ray Marching을 하다가 빛과 점점 멀어지는 순간 이미 빛 지점에는 도달했다는 것이다. 더 이상 Ray Marching을 수행할 필요가 없다고 판단할 수 있다.
즉 존재하는 빛의 방향으로 조금씩 이동하면서 shadow 맵에 교차되는 색상이 있는지 확인한다. 교차되는 색상이 있는 경우 객체가 가로 막고 있는 것으로 추정할 수 있다. 이런 경우 즉시 for 반복을 중단하고 해당 표면의 세기인 velocity을 0.3으로 지정한다.
그리고 색상을 렌더링한다.
댓글 0개
댓글은 일회용 패스워드가 발급되며 사이트 이용 약관에 동의로 간주됩니다.
확인
Whitmemit 개인 일지 블로그는 개인이 운영하는 정보 공유 공간으로 사용자의 민감한 개인 정보를 직접 요구하거나 요청하지 않습니다. 기본적인 사이트 방문시 처리되는 처리 정보에 대해서는 '사이트 처리 방침'을 참고하십시오. 추가적인 기능의 제공을 위하여 쿠키 정보를 사용하고 있습니다. Whitmemit 에서 처리하는 정보는 식별 용도로 사용되며 기타 글꼴 및 폰트 라이브러리에서 쿠키 정보를 사용할 수 있습니다.
이 자료는 모두 필수 자료로 간주되며, 사이트 이용을 하거나, 탐색하는 경우 동의로 간주합니다.