Tạo địa hình trên GPU


9

Trong động cơ của tôi, tôi tạo địa hình vô hạn với việc sử dụng thuật toán nhiễu Perlin được tính toán trên CPU.

Tạo địa hình như thế này:

  • Nếu máy ảnh gần bản vá không tải, hãy tạo nó
  • Tính toán mảng nhiễu 513x513 với các ranh giới đã cho
  • Tính toán chuẩn, tiếp tuyến, nhị phân, chỉ số
  • Truyền dữ liệu cho vbo

Ưu điểm:

  • Chỉ cần được kết xuất khi cần
  • Dễ va chạm

Con

  • Các bản vá chậm 64 513x513 được tạo trong 3,1 giây (một luồng). Đối với mỗi ô tạo ra tiếng ồn ~ 20ms, đỉnh ~ 25ms, quy tắc, tiếp tuyến, bitangent, chỉ số. Khi camera di chuyển nhanh, người dùng có thể nhận thấy tải gạch.
  • tiêu thụ bộ nhớ ???

Bây giờ tôi đã tự hỏi làm thế nào để tăng tốc độ này bằng cách tạo địa hình hoàn toàn trên GPU Nhưng có một số nghi ngờ:

  • Nếu các shader chạy mọi khung hình, thì đây có phải là sự lãng phí năng lượng tính toán để tính toán tiếng ồn nhiều lần không? Điều này có thể tránh được bằng cách ghi kết quả vào kết cấu RBGA và được sử dụng sau này trong shader đỉnh để dịch chuyển, nhưng tăng mức sử dụng bộ nhớ. Mặt khác, nếu việc tạo ra sẽ siêu nhanh, chỉ có các ô hiển thị sẽ nằm trong bộ nhớ. Tuy nhiên, bộ đệm tách rời gây ra đồng bộ hóa gpu-cpu có thể làm chậm ứng dụng (tôi có đúng không?)
  • Nếu địa hình chỉ là một lưới phẳng được dịch chuyển bởi bộ đổ bóng đỉnh, thì công việc tương tự cần được thực hiện trên CPU để tính toán chiều cao và bình thường tại điểm đã cho khi va chạm.
  • Đây chỉ là một khái niệm, nhưng để tăng tốc mọi thứ, tôi đã nghĩ về việc chiếu lưới trên khung nhìn để chỉ sử dụng số lượng đỉnh tối thiểu. Bạn có nghĩ rằng điều này sẽ làm việc?

Câu hỏi cuối cùng của tôi là:

Kỹ thuật nào tốt nhất / nhanh nhất / được sử dụng rộng rãi để tạo địa hình vô hạn trên GPU?


8
Chỉ cần lưu ý rằng việc tạo địa hình trên GPU sẽ gây khó khăn cho việc phát hiện va chạm, chọn phát hiện hoặc gần như bất kỳ loại tương tác nào với địa hình.
MichaelHouse

1
Một shader tính toán (DX10 hoặc 11) có thể được sử dụng để tạo địa hình trên GPU. Nhưng như Byte56 đã nêu, bạn sẽ cần phải rút các giá trị ra khỏi GPU để tương tác với nó. msdn.microsoft.com/en-us/l Library / windows / desktop / trộm
UnderscoreZero

tạo địa hình trên GPU loại âm thanh như một ý tưởng tồi đối với tôi. Nó có thể hoạt động nhưng tôi cho rằng nó có thể sẽ hoạt động tốt hơn một chút nếu bạn chỉ tạo địa hình ở phía CPU và gửi công cụ vẽ tiêu chuẩn đến GPU.
Benjamin Danger Johnson

Chỉ là kinh nghiệm của tôi; Tôi thực sự đã làm điều này với aparapi và thực sự có những thứ chết tiệt để làm việc; nhưng nó thực sự đã kết thúc chậm hơn so với việc cpu thực hiện công việc. Tôi nghĩ bởi vì chi phí gửi dữ liệu đến / từ gpu. Nếu tôi nhớ chính xác thì gpu chỉ thực sự hoạt động nếu phép tính lớn so với kích thước của dữ liệu (và cũng lớn về mặt tuyệt đối)
Richard Tingle

Bài viết này có thể cung cấp cho bạn một số ý tưởng http.developer.nvidia.com/GPUGems3/gpugems3_ch01.html
Jeremiah Leslie

Câu trả lời:


2

Chà, nếu tôi cố gắng sử dụng GPU cho một việc như vậy, tôi nghĩ tôi sẽ đi tính toán / opencl / cuda.

Tuy nhiên, bất kể sử dụng GPU hay CPU (đó là những gì tôi thực sự làm), tôi sẽ làm điều đó theo cách không đồng bộ, quyết định bạn cần một số địa hình mới cho khung hình hiện tại có thể là quá muộn (ví dụ: xem xét 1000ms / 60 = 16.666ms, và toàn bộ khung muốn phù hợp với điều đó).

Bắt đầu tạo (hoặc tải từ địa chỉ tệp nén) trên luồng công nhân và cung cấp cho phần còn lại của trò chơi và kết xuất khi nhân viên đó kết thúc, nói chung đây sẽ là khung tiếp theo, hoặc có lẽ là khung sau đó, vì vậy Người dùng sẽ không thực sự nhận thấy sự khác biệt ở đó, nhưng nó làm cho mọi thứ mượt mà hơn.

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.