다이내믹 한 세상을 위해 서명 된 거리 필드 레이 행진은 어떻게 구현됩니까?


10

서명 거리 필드 레이 행진의 기본 사항을 이해한다고 생각합니다. 거리 필드 (예 : http://iquilezles.org/www/articles/distfunctions/distfunctions.htm )를 사용 하여 장면을 모델링 한 다음 각 픽셀에 대해 광선을 투사하고 광선의 시작 부분부터 시작합니다 , 해당 지점에서 가장 가까운 물체까지의 거리를 찾고, 무언가를 칠 때까지 가장 가까운 거리만큼 점을 증가시킵니다. 간단한 렌더러를 만들었고, 그 기술에 대한 대부분의 설명이 멈췄습니다.

따라서 실제 시나리오에서 SDF Ray Marching을 사용하는 방법에 대한 몇 가지 질문이 있습니다.

질문 1 : 실제 게임에서 장면은 일반적으로 복잡하고 CPU에 많은 동적 객체가로드됩니다. 기본 오 클루 전 컬링 (예 : 옥트리)을 이해하고 다각형 렌더링을 사용하여 뷰 프러스 텀에 렌더링 할 항목 목록 (CPU)을 만듭니다.

따라서 CPU로 제어되는 화면에서 움직이는 많은 캐릭터와 동적 객체가있는 매우 복잡한 장면이 있다고 상상해보십시오. 프레임마다 GPU로 렌더링하려는 객체를 어떻게 스트리밍합니까? 모든 예제에는 장면이 GLSL로 하드 코딩되어 있습니다. 누군가 레벨이 쉐이더에 동적으로 스트리밍되는 예를 공유 할 수 있습니까?

질문 2 : 물체는 어떻게 여러 색상을 가질 수 있습니까? 거리 함수는 거리 만 반환하지만 구현시 일반적으로 어떻게 색상을 다시 전달합니까? (예를 들어 블루 큐브가 아닌 빨간색 구를 쳤습니다.) 이것이 CPU 구현 인 경우 ray marcher를 종료하는 히트가 될 때 distance 함수 내부의 전역 함수를 호출 할 수 있으며 히트 오브젝트의 질감 / 컬러. 그러나 GLSL에서 항목의 색상이나 질감을 어떻게 반환합니까?

감사합니다.

답변:


2

이것은 최소 답변이지만 더 나은 답변을 얻지 못한 경우 정보를 공유하고 싶었습니다.

실제 게임에서 레이 행진을 사용하는 방법에 대해서는 일반적으로 그렇지 않습니다. 지난 몇 년 동안 만 화면 공간 반사를 위해 깊이 버퍼를 레이 마치하기 시작한 게임이 있지만, 내가 아는 게임은 설명하는 방식으로 레이 마칭을 사용하지 않습니다.

색상 및 기타에 대한 다른 질문의 경우, 사람들은 일반적으로 재료를 물체와 연관시키고 광선이 물체를 때리는 점의 "텍스처 좌표"를 사용하여 물체의 해당 점에서 재료 특성을 알아냅니다. 일반적인 재료로는 확산 색상, 정반사 강도, 발광 색상 및 투명도 / 굴절률 등이 있습니다.

그것이 당신에게 도움이 되길 바랍니다! 그래픽 스택 교환 사이트에서 좋은 답변을 얻을 수도 있습니다.


2
"내가 알고있는 게임은 사용자가 설명하는 방식으로 레이 행진을 사용하지 않습니다"Media Molecule의 다가오는 게임 Dreams는 사용자 생성 컨텐츠 조각에 서명 된 거리 필드를 사용하지만, 올바르게 이해하면 필드가 렌더링 대신 포인트 클라우드로 변환됩니다. 직접 raymarched되고 있습니다. 이 기사에는 몇 가지 아이디어가있을 수 있습니다. dualshockers.com/2015/08/15/…
DMGregory

1
@DMGregory Nice, 그러나 이것이 Ray Marching이 아니라고 생각합니다. 따라서 요점은 여전히 ​​유효합니다. 게임은 일반적으로 광선 행진을 사용하지 않습니다.
concept3d

1
이 스레드 업데이트-곧 출시 될 게임 인 Claybook은 거리 필드를 통해 직접 발사 된 광선을 사용하여 장면 을 기존의 지오메트리로 먼저 변환하는 대신 장면을 렌더링한다고합니다 . "아직?" 2 년이 지났을 것으로 보인다. :)
DMGregory

1

현재 서명 된 거리 필드를 렌더링 기법으로 사용하여 부드러운 절차 형상을 표시하는 게임 엔진을 개발하고 있습니다 (현재 링크의 것과 같은 간단한 기본 요소로 생성되어 향후 Julia와 IFS 프랙탈을 구현하려고합니다). 내 엔진은 절차 적 생성에 중점을 두어 광선을 친숙하게 만드는 방식으로 그림을 정의 해야 하기 때문에 나는이 질문에 대답하기에 좋은 장소에 있다고 생각합니다 .P.

스트리밍과 관련하여 간단한 해결책은 일종의 유형이 지정된 버퍼를 사용하여 레이 마칭을 수행하려는 경우 GPU에 던져 넣는 것입니다. 버퍼의 각 요소는 복합 유형 (예 : C / C ++의 구조체)이며 각 유형에는이를 나타내는 데 사용해야하는 기능, 위치, 회전, 배율 등 및 평균 색상을 정의하는 요소가 포함됩니다. 그런 다음 프로세스는 다음과 같이 단순화됩니다.

  1. 장면을 관리 가능한 하위 세트로 컬링 (절두체 컬링 및 오 클루 전 컬링은 광선 마칭 알고리즘에 의해 부분적으로 자동 수행됨)
  2. 서브 세트를 렌더 입력 버퍼로 전달
  3. 버퍼가없는 경우 버퍼를 GPU로 전달한 다음 일반적인 전통적인 레이 마칭으로 장면을 렌더링합니다. 광선 버퍼의 각 반복마다 입력 버퍼의 어떤 항목이 각 광선에 가장 가까운지를 평가하려면 일종의 단계별 검색을 수행해야하며 광선에 변형을 적용해야합니다 (이 경우 GPU에 도달하기 전에 그림 회전을 반전시켜야하거나 거리 함수 자체 (위치 변경을 위해 함수 원점 이동, 스케일 변경을위한 입방체 길이 등 조정) 등 가장 간단한 방법은 광선을 수정하는 것입니다 실제 코어 거리 기능으로 전달합니다.

그림 색상과 관련하여 셰이더를 사용하면 기본 유형뿐만 아니라 복잡한 유형도 정의 할 수 있습니다. 이를 통해 모든 것을 C 스타일 구조체에 넣은 다음 거리 함수에서 해당 구조체를 다시 전달할 수 있습니다.

내 엔진에서 각 구조체에는 거리, 색상 및 ID를 입력 버퍼의 해당 그림 정의에 연결하는 거리, 색상 및 ID가 포함되어 있습니다. 각 ID는 관련 거리 함수의 주변 컨텍스트에서 추론됩니다 (매핑 함수가 입력 버퍼를 반복하여 각 단계마다 각 광선에 가장 가까운 그림을 찾기 때문에 각 SDF가 호출 될 때 루프 카운터의 값을 안전하게 처리 할 수 ​​있습니다 거리 값은 임의의 코어 SDF를 사용하여 정의됩니다 (예 : 해당 기능의 그림 ID).point - figure.pos 구의 경우), 색상은 그림 버퍼에있는 적절한 요소의 평균 색상 (따라서 그림 ID를 유지하는 것이 유용한 이유) 또는 저장된 평균에 가중치를 둔 절차 적 색상을 통해 정의됩니다 (예 : Mandelbulb의 특정 지점에 대한 반복 횟수, "평균 색상"을 FP 색상 공간에서 정수 색상 공간으로 매핑 한 다음 매핑 된 색상을 반복 횟수에 대해 XOR하여 팔레트로 사용합니다.

절차 적 텍스처는 또 다른 접근법이지만, 나는 그것들을 직접 사용한 적이 없습니다. iq는이 분야에서 많은 연구를 수행하고 Shadertoy에 대한 흥미로운 시연을 게시 했으므로 추가 정보를 수집하는 한 가지 방법이 될 수 있습니다.

상관없이 색상 각 도면, 절차 적 생성, 또는 마술 절차 적 텍스처로부터 샘플링 정적인지의 기본적인 논리 같다 : 중간 복합 타입의 일종 (예 구조체)으로 추상 수치 저장 모두 로컬 거리 지방을 해당 유형의 인스턴스에서 색상을 지정한 다음 복합 유형을 거리 함수의 반환 값으로 전달하십시오. 구현에 따라 출력 색상이 화면으로 직접 전달되거나 충돌 지점을 따라 조명 코드로 전달 될 수 있습니다.

위의 내용이 충분히 명확한 지 알 수 없으므로 의미가 없는지 묻지 않아도됩니다. HLSL로 작업하고 음영 처리를 계산 한 이후로 GLSL / 픽셀 음영 코드 샘플을 실제로 줄 수는 없지만 처음에는 제대로 작성하지 않은 모든 것을 시도해 봅니다. :).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.