부호있는 거리 필드 (2D)를 실시간으로 빠르게 생성하려면 어떻게해야합니까?


21

A의 이전 질문 , 그것은 서명 거리 필드, 미리 계산 런타임에로드 할 수 있음을 제시 한 후 거기에서 사용했다.

이 질문의 끝에서 (관심있는 사람들을 위해) 설명 할 이유 때문에, 거리 필드를 실시간으로 만들어야합니다.

Chamfer 거리 변환 및 Voronoi 다이어그램 근사 기반 변환 ( Pixeljunk Shooter dev guy이 프레젠테이션 에서 제안)과 같은 실시간 환경에서 실행 가능한 다양한 방법에 대한 몇 가지 논문 있지만 나는 일반적으로 길고, 수학에 부풀어 있고 설명에 알고리즘이 많지 않기 때문에 실제로 사용하기가 매우 어렵습니다.

특히 거리 필드의 결과 품질을 고려하여 거리 필드를 실시간으로 (GPU에서 유리하게) 생성하기 위해 어떤 알고리즘을 제안 하시겠습니까?

다른 논문이나 슬라이드에 대한 링크가 아닌 실제 설명 / 튜토리얼을 찾고 있기 때문에이 질문은 하나의 자격이되면 현상금을받습니다 :-).

실시간으로해야하는 이유는 다음과 같습니다.

큰 2D 환경에서 이러한 SDF를 사전 계산해야하는 경우 (대형 테라 리아 같은 맵을 생각하면) 스토리지 공간 (및 맵 생성 시간)에서 더 큰 오버 헤드를 수용하여 더 많은 것을 구현하는 것을 의미합니다. 실시간 SDF 생성을 위해 충분히 빠른 복잡한 알고리즘.

예를 들어, 타일 크기가 10 * 10 픽셀이고 총 크기가 10000 * 2560 픽셀 인 1000 * 256 (너비 * 높이)의 비교적 작은 맵은 상대적으로 작은 크기를 선택하면 이미 약 2MB의 비용이 듭니다 거리 값만 0에서 255까지 저장한다고 가정하면 128x128의 SDF 해상도.

분명히, 이것은 너무 빨리 커질 수 있으며 내가 원하지 않는 오버 헤드입니다.

다른 것이 있습니다 :

SDF는 충돌 감지와 같은 많은 용도로 사용될 수 있으며 일부 유용한 응용 프로그램은 아직 발견되지 않았습니다. 앞으로 많은 사람들이 이러한 것들을 찾을 것이라고 생각합니다. 여기에 포괄적 인 답변이 있으면 많은 사람들을 도울 것이라고 생각합니다.


나는 "무슨 서명 거리 필드"먼저 히트하는 것은 GPU 버전이었다 봤 : http.developer.nvidia.com/GPUGems3/gpugems3_ch34.html 그것은 조금 늙었지만 추가하여 검색을 도움이 될 수 있습니다.
Patrick Hughes

1
어쩌면 나는 무언가를 놓치고 있지만, 왜 실시간으로해야하는지 (특히 스포일러 태그가 붙은 이유)에 대한 진술로 다소 혼란스러워합니다. 첫째, 128x128의 SDF에 대한 2MB 수치는 어디서 얻습니까? 둘째, 왜 2MB를 특히 메모리 사용량이 많은 것으로 생각하십니까? 나는 그것이 실용적이지 않다는 데 동의하지만, 전체지도 메모리 사용량의 작은 부분 인 것 같습니다. 셋째, 실시간으로 필드를 생성하면 해당 메모리가 어떻게 절약됩니까? 즉시 생성되거나 사전 계산 된 데이터에 관계없이 동일한 데이터를 정확하게 저장해야합니까?
Steven Stadnicki

보다 광범위하게는 SDF가 필요한 기술이 아닌 경우가 많습니다. 특정 상황 (정적 장애물 수, 동적 장애물 수 등)에 대한 자세한 정보와 정확하게 달성하려는 효과는 사용자에게 가장 유용한 항목을 찾아내는 데 도움이됩니다.
Steven Stadnicki

1
거리 필드를 실시간으로 생성 한 경우 프레임 당 2MB 씩만 2MB를 생성합니다 (화면에 하나만 필요하므로 총 메모리 오버 헤드는 항상 하나의 거리 필드에 필요한 메모리입니다). 내 1000x128 예보다 큰지도가있는 경우 (큰 Terraria지도가 10000을 넘어선다고 생각합니다) 해당지도의 1000x128 서브맵마다 2mb 중 하나가 필요합니다. 처음에 SDF가 필요한 이유는이 질문의 시작 부분에서 링크 한 첫 번째 질문 (GPU 2D 섀도 캐스팅 용)에 설명되어 있습니다.
TravisG

1
@heishe 프레임 당 한 번 2Mb의 데이터를 생성하려고합니까? 진심이야?
kaoD

답변:


9

Catalin Zima는 그의 기사 에서 동적 2D 그림자를 얻는 방법을 설명 하고 서명 된 거리 필드를 사용합니다 (이 문맥에서 그림자 버퍼의 멋진 이름 임). 그의 방법은 GPU를 필요로하며, 그의 구현은 최고가 아닙니다 (내 기계의 약 20 조명에서 60Hz 이하로 떨어졌고, 약 500 조명을 얻었습니다). 속도보다 코드의 명확성을 선호했기 때문에 예상됩니다.

이행

그에 의해 구현 된대로 :

  1. 모든 그림자 캐스터를 텍스처로 렌더링합니다.
  2. 각 픽셀의 빛 중심까지의 거리를 계산하고 해당 값을 불투명 픽셀의 RGB에 할당합니다.
  3. 이미지가 왜곡되어 3D 카메라가 해당 픽셀을 어떻게 보았는지 나타냅니다.
  4. 그의 기사에 설명 된 비정상적인 크기 조정을 사용하여 이미지를 2xN 크기의 이미지로 스쿼시하십시오 (일반 크기 조정은 작동하지 않음).
  5. 2xN 이미지는 이제 네 사분면의 모든 사분면에 대한 부호있는 거리 필드입니다 (한 사분면은 기본적으로 90도에서 단일 카메라 절두 인 것을 기억하십시오).
  6. 라이트 맵을 렌더링하십시오.
  7. 부드러운 그림자를 얻도록 라이트 맵을 흐리게 만듭니다 (빛과의 거리에 따라).

최종 구현은 다음과 같습니다 (각 단계는 단일 셰이더 임).

  1. (1)을하십시오.
  2. 수행 (2)와 (3) .
  3. (4)를하십시오. 그의 구현은 실제로 느립니다 : 만약 당신이 이것을 위해 GPGPU를 사용하려고 시도한다면. 나는 GPGPU (XNA)를 사용할 수 없으므로 내가 한 일은 다음과 같습니다.
    • 첫 번째 N / 2 열이 정확히 동일한 위치 (최종 버퍼의 첫 번째 열을 덮음)이지만 텍스처 좌표가 다른 (두 번째 N / 2 열과 동일) N / 2 쿼드로 표시되는 메시를 설정합니다.
    • GPU에서 깊이 테스트를 끕니다.
    • MIN 픽셀 블렌딩 기능을 사용하십시오.
  4. (6)과 (7)을하십시오.

매우 독창적입니다. 기본적으로 그림자가 3D에서 2D로 처리되는 방식을 직접 변환 한 것입니다.

함정

주요 함정은 일부 객체는 그림자가 없어야한다는 것입니다. 제 예에서는 Liero (실시간 웜) 복제본을 작성하고 있었기 때문에 플레이어의 웜을 그림자 화하지 않기를 원했습니다 (적어도 하나는 아닙니다) 각 플레이어의 화면에서). 이 '특수한'객체에 대해 내가 한 모든 것은 마지막 단계로 다시 그리는 것입니다. 아이러니 한 사실은 대부분의 물체가 그림자 (웜, 풍경 전경)가 아니었기 때문에 여기에는 오버 드로우 문제가 있다는 것입니다.


크기 조정 방법에 대한 조정이 60fps 이상인 500 개의 조명을 처리 할 수있는 유일한 속도입니까?
TravisG

좋아, 나는 원래의 문제를 해결하기 때문에 대답을 받아 들일 것이지만, 실제로 현상금을 준 것에 대답하지는 않습니다. 나는 기다릴 것이고 누군가가 서명 된 거리 필드 생성을위한 몇 가지 O (N) 방법 중 하나를 설명하기 위해 오랫동안 온다.
TravisG

첫 번째 질문에 관한 @heishe : 확실하지 않습니다. 나는 한 번에 모든 최적화를 수행했습니다-나는 그것을 끄고 프레임 속도가 실질적으로 떨어지는 것을 보았던 것을 기억합니다. 조명 당 올인원 6 드로우 콜은 프레임 속도를 떨어 뜨립니다. 내가 말했듯이, 내가 말할 수있는 것처럼, 단계 (5)에서 4 개의 서명 된 거리 필드가 있지만 그에 대해 더 알고있는 사람은 그것을 확인해야합니다.
Jonathan Dickinson

음, 이것은 서명 된 거리 필드의 매우 특별한 경우입니다. 정상적인 부호있는 거리 필드에서 모든 픽셀은 가장 가까운 장애물까지의 거리를 포함합니다. 이 알고리즘에서 거리 필드는 하나의 장애물 만 포함하며 장애물은 전체 이미지 (광원)에서 1 픽셀에 불과하므로이 거리 필드는 O (N)로 생성 될 수 있습니다.
TravisG

1
@heishe는 내 쉐이더입니다 : gist.github.com/2384073 . DistortPS는 2 + 3입니다.
Jonathan Dickinson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.