흐르는 GPU 컴퓨팅 물


15

나는 토목 공학 배경을 가지고 있으며 수압 및 수 문학적 분석을 정기적으로 수행합니다. 그들은 그런 종류의 물건에 대한 학위를 판매하지만 실제로 로켓 과학은 아닙니다. 최근 GPU의 지형에 대한 전체 수문 및 유압 프로세스를 구현해야한다는 생각이 들었습니다. 컴퓨팅 쉐이더를 최근에 배웠기 때문에 현재 병렬 GPU 워크 플로를 디자인하는 것보다 엔지니어링에 더 능숙합니다.

다음 공식을 사용하여 강우량이 발생하는 동안 생성 된 물의 양을 계산할 수 있습니다.
Q (CF/S) = c * I (in/hr) * A (acres)

첫 번째 영역의 "정확도"를 계산하는 것 이상으로 어려움을 겪고 있습니다.

현재 구현 개요 :

  1. 지형은 1 단위 간격으로 정점의 규칙적인 그리드입니다.
  2. 하이트 맵에는 각 정점마다 하나의 R32 높이 값이 포함됩니다
  3. 현재 4 개의 기본 방향으로 만 흐름을 허용합니다 (대각선 없음)
  4. 이미 분석 한 정점의 스텐실로 Texture2D [int]를 사용하고 있습니다.

현재 알고리즘 :

  1. 지형 도구가 활성화되어 있고 현재 활성화되어 있지 않은 경우 ...
  2. "스텐실"을 지우십시오.
  3. 전체 지형을 스캔하여 가장 낮은 고도를 찾으십시오.
  4. 이 단일 지점은 CS_Flood의 초기 입력입니다.
  5. CS_Flood는 X 축 패스를 만듭니다.
  6. 각 입력 정점은 최대 2048 배까지 X 및 X + 방향으로 투사됩니다.
  7. OOB 좌표로 인접한 정점을 찾으면이 방향으로 지형의 가장자리를 나타냅니다. CurrentPoint가 BoundaryPoints 버퍼에 추가되고 해당 방향에 대한 투영 루프가 종료됩니다. 이것은 쉬웠고 매번 훌륭하게 작동합니다.
  8. 높이가> = 인 인접 정점은 현재 정점의 높이가 스텐실에 표시되고 NextPass 버퍼에 추가됩니다.
  9. 높이가 <현재 정점의 높이 인 인접 정점은 능선의 정점을 나타내며 투영 루프를 종료합니다. 홍수 채우기의 미래 반복 할 수 그것의 "뒤로"쪽까지 능선의 기반을 주위 흐름과 같은 능선를 두 번 감지합니다.
  10. 이 목적을 위해 두 번 이상 감지 된 피크 / 리 지점 은 BoundaryPoint 가 아닙니다 .
  11. 정확히 한 번 감지 된 피크 / 리지 점은 경계점에 추가되고 해당 방향의 투영 루프가 종료됩니다.
  12. CS_Flood는 X 축 패스에 의해 생성 된 포인트를 입력으로 사용하여 동일한 코드로 Z 축 패스를 만듭니다.
  13. 현재 CS_Flood는 두 방향을 무한정 번갈아 계속합니다. 결국 CS_Flood가 완료되고 NextPass 버퍼가 비어있을 때마다 전체 루프를 종료합니다.

그 시점에서 BoundaryPoints는 자연 배수구에서 발생하는 각 정점을 포함하는 것이 이상적입니다. 경계 내에서 물이 떨어지면 결국 같은 낮은 지점으로 흐릅니다. 물이 튀어 나오면 경계가 "어딘가로"갑니다.

그때:

  1. 스텐실을 지우지 않고 스텐실이 아닌 가장 낮은 정점에 대해 지형을 다시 스캔합니다.
  2. CS_Flood를 반복하십시오.
  3. 스텐실이 가득 찰 때까지 반복하십시오.

3D는 이러한 색상을 인식하기 어렵습니다. 이것은 완전한 고도에서의 등고선을 보여줍니다 :
(가장자리 근처의 숫돌로 둘러싸인 구멍) 가장자리 버림 구멍

정점을 가로 질러 배수하는 방법은 약 10 가지가 있습니다. 각각 고유 한 색상을 제공합니다.
(보이는 원형 툴 마크, "릿지"가 잘 나타납니다) 여기에 이미지 설명을 입력하십시오

이것은 CS_Flood에 의해 생성 된 모든 점, 경계 등을 POINTLIST로 표시합니다. 여기에 이미지 설명을 입력하십시오

알고리즘은 항상 거의 작동합니다 . 때로는 제대로 작동합니다. 다른 경우에는 알고리즘이 올바른 모양으로 명확하게 포함되어 있지만 점을 무기한으로 계속 출력합니다. 세 번째 스크린 샷에서 볼 수 있듯이 때로는 혼란스러워집니다. 내가 간과 한 또 다른 상황 / 요인이 있어야합니다. 문제를 공격 할 수있는 더 간단하고 우아한 방법에 대한 감독이나 제안을 찾는 데 도움을 주시면 감사하겠습니다.

결 측점

MissingPoint! 알고리즘을 지원하여 NextPass 버퍼에 감지 된 모든 새로운 BoundaryPoint를 추가하여 포함시킬 수 있습니다. 다음 단계에서 해당 반창고에 의해 생성 된 포인트의 99 %는 소량의 GPU 시간을 낭비하여 아무데도 갈 수없고 아무것도 할 수 없다고 판단합니다. 첫 번째 패스 중에 다른 NextPass 포인트와 함께 LowestPoint를 전송하면이 특정 시나리오를 처리 할 수 ​​있습니다.

나는 그것이 그럴듯하다는 것을 알고, 충분한 시간이 주어지면, 내가 원하는 것을 할 수있을만큼 충분히 반창고를 줄 수있을 것입니다. 가능하면 더 좋고 똑똑하며 더 빠른 방법으로하고 싶습니다. 아직 더 잘 알 수있는 경험이 없습니다.


지형에서 모든 물이 배수되는 곳을 계산하고 싶습니까?
EvilTak

@EvilTak, 나는 좋은 알고리즘에 정착했다고 생각하지만, 나는 설명 할 경험이없는 "이상한 것들"을 얻고 있습니다. 병렬 GPU에 능숙하다면 gamedev.stackexchange.com/questions/118556/…
Jon

답변:


1

하락이 정점을 방문하기 위해 "시도"했을 때, 스텐실은 InterlockedExchange"원래 값"을 사용하여 이미 스텐실 인지 여부를 결정했습니다 (방금 덮어 쓴 경우에도).

내가 생각해 낸 최고의 알고리즘은 홍수에 "스크래치 패드"와 단일 규칙 : "내리막 지 않는 흐름"(높이 이상)을 부여했습니다. 그로 인해 거의 모든 복잡한 테스트가 제거되었습니다. 이 흐르지 않는에서 일반적으로 좋은 반면 에 걸쳐 피크 / 능선, 그 흐름 않습니다 함께 인접한 정점은 "평면"때문에 그들. 이것은 때때로 방울이 능선을 지나서 빠져 나갈 수있게합니다.

여기에 이미지 설명을 입력하십시오

"너무 먼"지점은 각각 "흐르고"배수 영역으로 "흐르고"(1에서 정지) 또는되지 않습니다 (0에서 정지). "nots"는 폐기되고 수정 된 스크래치 패드는 "final"에 복사됩니다. 최종판이 이미 스텐실 처리 된 경우 스크래치 패드는 폐기됩니다. (미래 : 이러한 충돌은 집합 적으로 현재 배수 영역의 외부 경계를 나타내야합니다.)

10FPS에서 :

여기에 이미지 설명을 입력하십시오

"nots"는 빨간색으로 표시됩니다. 일단 큰 영역이 최종 영역에 복사되고 녹색이되면 나머지 비 스텐실 영역에 대해 알고리즘이 반복됩니다.

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