나는 토목 공학 배경을 가지고 있으며 수압 및 수 문학적 분석을 정기적으로 수행합니다. 그들은 그런 종류의 물건에 대한 학위를 판매하지만 실제로 로켓 과학은 아닙니다. 최근 GPU의 지형에 대한 전체 수문 및 유압 프로세스를 구현해야한다는 생각이 들었습니다. 컴퓨팅 쉐이더를 최근에 배웠기 때문에 현재 병렬 GPU 워크 플로를 디자인하는 것보다 엔지니어링에 더 능숙합니다.
다음 공식을 사용하여 강우량이 발생하는 동안 생성 된 물의 양을 계산할 수 있습니다.
Q (CF/S) = c * I (in/hr) * A (acres)
첫 번째 영역의 "정확도"를 계산하는 것 이상으로 어려움을 겪고 있습니다.
현재 구현 개요 :
- 지형은 1 단위 간격으로 정점의 규칙적인 그리드입니다.
- 하이트 맵에는 각 정점마다 하나의 R32 높이 값이 포함됩니다
- 현재 4 개의 기본 방향으로 만 흐름을 허용합니다 (대각선 없음)
- 이미 분석 한 정점의 스텐실로 Texture2D [int]를 사용하고 있습니다.
현재 알고리즘 :
- 지형 도구가 활성화되어 있고 현재 활성화되어 있지 않은 경우 ...
- "스텐실"을 지우십시오.
- 전체 지형을 스캔하여 가장 낮은 고도를 찾으십시오.
- 이 단일 지점은 CS_Flood의 초기 입력입니다.
- CS_Flood는 X 축 패스를 만듭니다.
- 각 입력 정점은 최대 2048 배까지 X 및 X + 방향으로 투사됩니다.
- OOB 좌표로 인접한 정점을 찾으면이 방향으로 지형의 가장자리를 나타냅니다. CurrentPoint가 BoundaryPoints 버퍼에 추가되고 해당 방향에 대한 투영 루프가 종료됩니다. 이것은 쉬웠고 매번 훌륭하게 작동합니다.
- 높이가> = 인 인접 정점은 현재 정점의 높이가 스텐실에 표시되고 NextPass 버퍼에 추가됩니다.
- 높이가 <현재 정점의 높이 인 인접 정점은 능선의 정점을 나타내며 투영 루프를 종료합니다. 홍수 채우기의 미래 반복 할 수 그것의 "뒤로"쪽까지 능선의 기반을 주위 흐름과 같은 능선를 두 번 감지합니다.
- 이 목적을 위해 두 번 이상 감지 된 피크 / 리 지점 은 BoundaryPoint 가 아닙니다 .
- 정확히 한 번 감지 된 피크 / 리지 점은 경계점에 추가되고 해당 방향의 투영 루프가 종료됩니다.
- CS_Flood는 X 축 패스에 의해 생성 된 포인트를 입력으로 사용하여 동일한 코드로 Z 축 패스를 만듭니다.
- 현재 CS_Flood는 두 방향을 무한정 번갈아 계속합니다. 결국 CS_Flood가 완료되고 NextPass 버퍼가 비어있을 때마다 전체 루프를 종료합니다.
그 시점에서 BoundaryPoints는 자연 배수구에서 발생하는 각 정점을 포함하는 것이 이상적입니다. 경계 내에서 물이 떨어지면 결국 같은 낮은 지점으로 흐릅니다. 물이 튀어 나오면 경계가 "어딘가로"갑니다.
그때:
- 스텐실을 지우지 않고 스텐실이 아닌 가장 낮은 정점에 대해 지형을 다시 스캔합니다.
- CS_Flood를 반복하십시오.
- 스텐실이 가득 찰 때까지 반복하십시오.
3D는 이러한 색상을 인식하기 어렵습니다. 이것은 완전한 고도에서의 등고선을 보여줍니다 :
(가장자리 근처의 숫돌로 둘러싸인 구멍)
정점을 가로 질러 배수하는 방법은 약 10 가지가 있습니다. 각각 고유 한 색상을 제공합니다.
(보이는 원형 툴 마크, "릿지"가 잘 나타납니다)
이것은 CS_Flood에 의해 생성 된 모든 점, 경계 등을 POINTLIST로 표시합니다.
알고리즘은 항상 거의 작동합니다 . 때로는 제대로 작동합니다. 다른 경우에는 알고리즘이 올바른 모양으로 명확하게 포함되어 있지만 점을 무기한으로 계속 출력합니다. 세 번째 스크린 샷에서 볼 수 있듯이 때로는 혼란스러워집니다. 내가 간과 한 또 다른 상황 / 요인이 있어야합니다. 문제를 공격 할 수있는 더 간단하고 우아한 방법에 대한 감독이나 제안을 찾는 데 도움을 주시면 감사하겠습니다.
MissingPoint! 알고리즘을 지원하여 NextPass 버퍼에 감지 된 모든 새로운 BoundaryPoint를 추가하여 포함시킬 수 있습니다. 다음 단계에서 해당 반창고에 의해 생성 된 포인트의 99 %는 소량의 GPU 시간을 낭비하여 아무데도 갈 수없고 아무것도 할 수 없다고 판단합니다. 첫 번째 패스 중에 다른 NextPass 포인트와 함께 LowestPoint를 전송하면이 특정 시나리오를 처리 할 수 있습니다.
나는 그것이 그럴듯하다는 것을 알고, 충분한 시간이 주어지면, 내가 원하는 것을 할 수있을만큼 충분히 반창고를 줄 수있을 것입니다. 가능하면 더 좋고 똑똑하며 더 빠른 방법으로하고 싶습니다. 아직 더 잘 알 수있는 경험이 없습니다.