Chảy nước GPU tính toán


15

Tôi có một nền tảng kỹ thuật dân dụng và thực hiện phân tích thủy lực và thủy văn 'thường xuyên. Họ bán độ cho những thứ đó, nhưng đó thực sự không phải là khoa học tên lửa. Gần đây tôi đã có ý tưởng thực hiện toàn bộ quy trình thủy văn và thủy lực cho một địa hình trên GPU. Tôi mới học các shader tính toán chỉ gần đây vì vậy hiện tại tôi đang bị mắc kẹt về kỹ thuật hơn là thiết kế các quy trình làm việc GPU song song.

Bạn có thể tính lượng nước được tạo ra trong một sự kiện mưa bằng công thức:
Q (CF/S) = c * I (in/hr) * A (acres)

Tôi đang gặp khó khăn khi di chuyển ngoài việc tính toán "diện tích" của khu vực đầu tiên.

Tổng quan về triển khai hiện tại:

  1. Địa hình là một mạng lưới các đỉnh đều đặn với các khoảng 1 đơn vị
  2. Một sơ đồ chiều cao chứa một giá trị chiều cao R32 cho mỗi đỉnh
  3. Hiện tại, tôi chỉ cho phép lưu chuyển theo 4 hướng chính (không có đường chéo)
  4. Tôi đang sử dụng Texture2D [int] làm khuôn tô cho các đỉnh tôi đã phân tích

Thuật toán hiện tại:

  1. Khi công cụ địa hình đã hoạt động và bây giờ, không ....
  2. Xóa "stprint".
  3. Quét toàn bộ địa hình để có độ cao thấp nhất.
  4. Điểm duy nhất đó là đầu vào ban đầu cho CS_Flood.
  5. CS_Flood thực hiện vượt qua trục X.
  6. Mỗi đỉnh đầu vào được chiếu theo cả hai hướng X- và X + lên tới 2048 lần.
  7. Tìm một đỉnh liền kề với tọa độ OOB cho biết cạnh của địa hình theo hướng này. CurrentPoint được gắn vào bộ đệm BoundaryPoints và vòng lặp chiếu cho hướng đó bị chấm dứt. Điều này là dễ dàng và làm việc tuyệt vời mọi lúc.
  8. Các đỉnh liền kề có chiều cao> = chiều cao của đỉnh hiện tại được đánh dấu trong khuôn tô và thêm vào bộ đệm NextPass.
  9. Các đỉnh liền kề có chiều cao <chiều cao của đỉnh hiện tại biểu thị đỉnh của một sườn núi và chấm dứt vòng chiếu. Một lần lặp lại trong tương lai của vùng lũ có thể chảy xung quanh chân núi, lên phía "phía sau" của nó và phát hiện cùng một sườn núi lần thứ hai.
  10. Bất kỳ điểm cao nhất / sườn núi nào được phát hiện nhiều lần sẽ không phải là BoundaryPoint, cho mục đích này.
  11. Bất kỳ điểm đỉnh / sườn núi nào được phát hiện chính xác một lần đều được gắn vào BoundaryPoints và vòng lặp chiếu theo hướng đó bị chấm dứt.
  12. CS_Flood tạo một đường chuyền trục Z có cùng mã, sử dụng các điểm được tạo bởi đường truyền trục X làm đầu vào.
  13. Ngay bây giờ, CS_Flood tiếp tục xen kẽ giữa hai hướng vô thời hạn. Cuối cùng, tôi sẽ chấm dứt vòng lặp tổng thể bất cứ khi nào CS_Flood hoàn thành và bộ đệm NextPass trống.

Lý tưởng nhất là tại thời điểm đó, BoundaryPoints sẽ chứa từng đỉnh xảy ra trên đường phân thoát nước tự nhiên. Những giọt nước hạ cánh trong ranh giới cuối cùng chảy xuống cùng một điểm thấp. Giọt nước rơi xuống ranh giới đi "nơi khác".

Sau đó:

  1. Không xóa stprint, quét lại địa hình cho đỉnh thấp nhất, không stprinted.
  2. Lặp lại CS_Flood.
  3. Lặp lại cho đến khi stprint đầy (hoặc một cái gì đó tương tự).

3D rất khó nhận biết với những màu sắc này; điều này cho thấy các đường đồng mức ở độ cao tích phân:
(một lỗ được bao quanh bởi một berm gần rìa) lỗ berm cạnh

Có khoảng 10 cách duy nhất để thoát qua một đỉnh; tạo cho mỗi người một màu sắc độc đáo trông giống như:
(dấu công cụ hình tròn có thể nhìn thấy, "đường vân" hiển thị độc đáo) nhập mô tả hình ảnh ở đây

Điều này cho thấy mọi điểm được tạo bởi CS_Flood, ranh giới hoặc theo cách khác, dưới dạng POINTLIST: nhập mô tả hình ảnh ở đây

Các thuật toán luôn luôn gần như làm việc . Đôi khi, nó thậm chí hoạt động chính xác. Lần khác, thuật toán được chứa rõ ràng với hình dạng chính xác nhưng sẽ tiếp tục xuất điểm vô thời hạn. Như đã thấy trong ảnh chụp màn hình thứ 3, đôi khi nó bị lẫn lộn. Phải có một tình huống / yếu tố khác mà tôi đã bỏ qua. Tôi sẽ đánh giá cao bất kỳ trợ giúp nào trong việc tìm kiếm sự giám sát của tôi hoặc đề xuất các cách đơn giản và / hoặc thanh lịch hơn để tấn công vấn đề.

thiếu điểm

Mất điểm! có thể được bao gồm bằng cách hỗ trợ thuật toán để thêm mọi BoundaryPoint mới được phát hiện vào bộ đệm NextPass. Trong lần vượt qua tiếp theo, 99% số điểm được tạo bởi hỗ trợ băng tần đó sẽ lãng phí một lượng nhỏ thời gian GPU xác định rằng họ không thể đi bất cứ đâu và không làm gì cả. Trong lần vượt qua đầu tiên, việc gửi Lowpoint cùng với các điểm NextPass khác cũng sẽ xử lý tình huống cụ thể này.

Tôi biết điều đó là hợp lý và, khi có đủ thời gian, tôi sẽ có thể hỗ trợ ban nhạc đủ để làm những gì tôi muốn. Tôi muốn làm điều đó theo cách tốt hơn, thông minh hơn, nhanh hơn, nếu có thể và tôi chưa có đủ kinh nghiệm để biết rõ hơn.


Vì vậy, ý bạn là bạn chỉ muốn tính toán nơi tất cả nước thoát ra trong địa hình?
EvilTak

@EvilTak, tôi nghĩ rằng tôi đã giải quyết được một thuật toán tốt, nhưng tôi vẫn nhận được "những thứ kỳ lạ" mà tôi không có kinh nghiệm để giải thích. Nếu bạn giỏi về GPU song song, vui lòng xem: gamedev.stackexchange.com/questions/118556/ Kẻ
Jon

Câu trả lời:


1

Khi một giọt "cố gắng" truy cập vào một đỉnh, stprint được đánh dấu bằng InterlockedExchangecách sử dụng "giá trị ban đầu" để xác định xem nó đã được in chưa (mặc dù tôi chỉ ghi đè lên nó).

Thuật toán tốt nhất mà tôi nghĩ ra đã tạo cho lũ một "miếng đệm" và một quy tắc duy nhất: "không chảy xuống đồi" (độ cao bằng hoặc lớn hơn). Điều đó đã loại bỏ gần như tất cả các bài kiểm tra phức tạp. Mặc dù nhìn chung nó không tốt khi không chảy qua các đỉnh / rặng núi, nhưng nó chảy dọc theo chúng bởi vì các đỉnh liền kề là "phẳng". Điều này đôi khi cho phép giọt lẻn qua đường sườn núi.

nhập mô tả hình ảnh ở đây

Sau đó, mỗi điểm "quá xa" sẽ "chảy" và sẽ chảy "vào" khu vực thoát nước (dừng ở 1) hoặc không (dừng ở 0). Các "thông báo" bị loại bỏ và phần đệm được sửa chữa được sao chép vào "bản cuối cùng". Nếu trận chung kết đã được in sẵn, miếng đệm đầu bị loại bỏ. (Tương lai: những va chạm đó sẽ đại diện cho ranh giới bên ngoài của khu vực thoát nước hiện tại.)

Ở 10FPS:

nhập mô tả hình ảnh ở đây

Các "thông báo" được hiển thị bằng màu đỏ, một khi khu vực rộng lớn được sao chép vào cuối cùng và trở thành màu xanh lá cây, thì thuật toán sẽ lặp lại cho các khu vực chưa được in còn lại.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.