나는 shadertoy.com에서 발견 된 쉐이더를보고 있었고 멋진 것들 대부분에는 소음과 광선이 공통적으로 있습니다. 소스 코드를 전혀 이해하지 못하지만 정말로하고 싶습니다. 이 쉐이더는 어떻게 작동하고 raymarch 알고리즘은 어떻게 작동합니까? 나는 모든 것을 검색했으며 주제에서 아무것도 찾을 수 없습니다.
감사
나는 shadertoy.com에서 발견 된 쉐이더를보고 있었고 멋진 것들 대부분에는 소음과 광선이 공통적으로 있습니다. 소스 코드를 전혀 이해하지 못하지만 정말로하고 싶습니다. 이 쉐이더는 어떻게 작동하고 raymarch 알고리즘은 어떻게 작동합니까? 나는 모든 것을 검색했으며 주제에서 아무것도 찾을 수 없습니다.
감사
답변:
레이트 레이싱과 대조적으로 이해하는 것이 가장 쉬운 방법 일 것입니다.
레이트 레이싱으로 프리미티브를 렌더링하려면 프리미티브 및 입력 레이가 주어진 경우 해당 광선이 프리미티브에 도달하는 위치를 정확하게 알려주는 함수가 필요합니다. 그런 다음 모든 관련 프리미티브에 대해 광선을 테스트하고 가장 가까운 교차점을 선택할 수 있습니다. CPU가 좋습니다.
레이 마칭을 사용하면 간단한 광선 교차 기능이 없습니다. 광선에 점이 있으면 점이 표면에 얼마나 가까운 지 추정 할 수 있지만 표면에 닿도록 광선을 얼마나 멀리까지 확장해야하는지 정확히 알 수는 없습니다.
따라서 한 번에 한 단계 씩 "행진"합니다.
광선의 "시작"에서 시작-장면 렌더링을위한 가까운 평면 또는 경계 볼륨이 장면에서 하나의 객체 인 경우 경계 볼륨과의 교차. (아래 다이어그램에서 P0)
거리 함수를 평가하여 표면에 얼마나 가까운 지 추정하십시오. (다이어그램에서 가장 큰 원)
추정치에 따라 광선을 따라 앞으로 이동하십시오. 이동은 보수적으로 짧아야하므로 어디에서나 표면을 터널링하지 않을 것이라고 확신합니다.
이제 새로운 포인트가 생겼습니다 (아래 P1). 새로운 견적을 받고 반복하십시오.
지표면의 임계 거리 내에 있거나 최대 걸음 수에 도달 할 때까지 계속해서 견적을 받고 앞으로 나아가십시오. (아래 P4)
이제 표면의 깊이가 생겼으며 근처 샘플에서 법선 / 앰비언트 어 클루 전과 같은 것을 추론하고이 데이터를 사용하여 픽셀을 밝게하고 채색 할 수 있습니다.
각 광선은 독립적이며 각 단계에서 로컬 정보 만 (일반적으로) 사용하기 때문에 GPU에서 병렬화하기에 적합합니다. 종종 화면에 두 개의 삼각형 만 그려집니다. 이들을 래스터 화 한 후 프래그먼트 셰이더로 전달 된 각 픽셀은 단일 광선을 나타냅니다. 프래그먼트 셰이더는 광선이 표면에 도달 할 때까지 행진하여 결과를 반환합니다 (종종 별도의 전체 화면 패스에서 텍스처링 및 음영 처리를위한 심도 값).
정확한 단계는 달성하려는 특정 효과에 따라 다릅니다. 레이 마칭 기법은 다음과 함께 사용됩니다.
Raymarching은 Wikipedia의이 예제에서 와 같이 볼륨 반투명도를 렌더링하기 위해 각 단계에서 블렌딩 (보통 매번 거리를 추정하는 대신 고정 된 단계를 사용)하는 데에도 사용됩니다 .
이것은 상세한 구름을 실시간 으로 렌더링 하는 대중적인 방법이되었습니다 .
건물 창 뒤의 실내 공간 세부 사항을 시뮬레이션하는 방법 인 내부 매핑 조차도 광선이 창으로 들어오는 지점에서 가장 가까운 벽, 바닥 / 천장 또는 가구 평면까지 밟는 레이 마칭 형태로 간주 될 수 있습니다.
관심있는 특정 유형의 레이 마칭 효과가있는 경우 특정 예를 통해 새로운 질문을함으로써보다 자세한 답변을 얻을 수 있습니다. 가족에게는이 기술이 너무 다양하여 한 번에 모든 것을 다룰 수 없습니다. ;) 이것이 셰이더에서 발생하는 상황을 이해하기위한 프레임 워크를 제공하기를 바랍니다.