Làm thế nào tôi có thể kết hợp vật lý vào một thế giới được tạo theo thủ tục từ một shader hình học?


10

Về cơ bản, tôi muốn loại bỏ sự cần thiết phải tạo ra tiếng ồn kết hợp từ CPU đến GPU. Từ đó, tôi cũng muốn tạo địa hình cho một thế giới ba chiều bằng cách sử dụng tiếng ồn này như mật độ tại các điểm voxel. Sau này, tôi muốn lấy các mật độ đó và đa giác hóa (tạo các đỉnh) chúng đại diện cho địa hình của thế giới.

Điều này là tốt và tất cả. Nhưng, tôi cũng muốn biến dạng linh hoạt thế giới trong thời gian thực. Khi tôi đến thời điểm này, tôi gặp vấn đề khi cố gắng đưa các đỉnh trở lại CPU để thực hiện những việc như phát hiện va chạm và tất cả các tính toán trò chơi mà tôi muốn liên quan đến CPU chứ không phải GPU.

Vì vậy, câu hỏi là: làm thế nào tôi có thể đưa một tập hợp con của đỉnh trở lại CPU để xử lý các va chạm giữa những thứ khác?

Và một câu hỏi nữa: có cách nào dễ dàng để lấy một tập hợp các đỉnh và tạo các chỉ số từ chúng trên GPU không?

Tôi bối rối cũng như những loại shader nào tôi nên sử dụng cho những thứ khác nhau này. Tôi nghe nói về những người sử dụng một pixel shader để thu thập mật độ và sau đó sử dụng một shader hình học để xử lý việc tạo địa hình từ các đỉnh và sau đó bằng cách nào đó kết hợp một shader đỉnh để thực hiện các biến dạng động.

Tôi đang sử dụng C # 4.0, .NET 4.0 và XNA Game Studio 4.0.


1
Bạn nói rằng bạn đang sử dụng trình tạo bóng hình học trong tiêu đề, nhưng bạn cũng nói rằng bạn đang sử dụng XNA4.0, theo như tôi biết XNA 4.0 yêu cầu DirectX 10 (để dễ dàng phát triển hơn cho nền tảng đồng đều hơn) nhưng chỉ hỗ trợ các tính năng SM3.0, vì vậy không có shader hình học. forum.create.msdn.com/forums/p/31369/178924.aspx
Roy T.

Và bây giờ tôi sẽ không còn sử dụng XNA hay làm lại thiết kế của mình nữa. Cảm ơn đã chỉ ra rằng. Tôi đã xem xét nó và không nhận ra giới hạn này (không có SM 4). Tôi cho rằng câu hỏi vẫn còn, mặc dù không có sự xem xét của XNA. Vì vậy, từ góc độ chỉ DirectX, có cách nào để làm những gì tôi muốn không? Hoặc có lẽ với một shader đỉnh trong XNA?

1
Chà, XNA vẫn còn hiệu lực để sử dụng, trừ khi bạn có một trường hợp thử nghiệm đã được chứng minh trong đó thực hiện biến dạng và tạo quá chậm. Và bạn đã chứng minh trong một trường hợp thử nghiệm khác rằng GPU biến dạng + tạo và sau đó lấy dữ liệu trở lại CPU nhanh hơn :)
Roy T.

Thật. Chúng tôi thấy rằng việc sử dụng XNA và giữ mọi thứ trên CPU đã cho chúng tôi khoảng 1 triệu đỉnh trong khoảng ba phút trên Core i7 với 8 lõi và 8 luồng song song nhiều phần địa hình trên mỗi luồng. Khi cố gắng thực hiện điều đó trong thời gian thực và hy vọng hiển thị địa hình trước khi người chơi có thể nhìn thấy nó, chúng tôi đã đạt được khoảng 20 khung hình mỗi giây. Vì vậy, một trường hợp thử nghiệm chắc chắn là theo thứ tự với mỗi phương pháp.
Michael J. Gray

Câu trả lời:


3

Vì XNA không hỗ trợ trình đổ bóng hình học, tôi sẽ trả lời như thể bạn đang sử dụng DX 10. Về cơ bản, bạn có ba tùy chọn.

Các shader hình học Các shader Geometry thực sự có thể sửa đổi và thêm các đỉnh vào một bộ đệm đỉnh. Bạn có thể đọc lại điều này vào CPU. Tôi đã không nhìn vào nó, nhưng nó chắc chắn có thể.

Chỉ cần sử dụng CPU Thứ hai, tại sao bạn không tính toán nó trên CPU? Thực tế là nó chạy trên GPU trong shader cho thấy thuật toán biến dạng của bạn có thể bản địa hóa, tức là bạn có thể dễ dàng tạo ra các bộ phận liên quan để kiểm tra va chạm.

Ví dụ, tôi đã làm một trò chơi chèo thuyền cách đây một thời gian. Đại dương đã sử dụng các đỉnh bóng và đỉnh hình học để làm biến dạng nước bằng sóng. Tôi đã sử dụng thuật toán tương tự được tính toán trên CPU chỉ trên một vài điểm dưới thuyền cho chuyển động của thuyền trong sóng. Tôi chắc rằng bạn có thể làm một cái gì đó tương tự cho bản đồ voxel của bạn.

Trình tạo bóng pixel Tùy chọn cuối cùng, bạn cũng đã đề cập đến vấn đề này trong câu hỏi của mình: tạo mật độ trong trình đổ bóng pixel và ghi nó vào kết cấu 3D. Bạn có thể truy cập cái này từ CPU và các shader khá vô hại. Pixel shader là hoàn hảo cho nhiệm vụ này, nhưng phương pháp này có rất nhiều chi phí. Kết xuất kết cấu âm lượng, cũng như lấy mẫu từ trong đỉnh và địa lý. shader và phải đọc kết cấu trên CPU.

Tôi không biết chi tiết cụ thể về dự án của bạn, nhưng tôi sẽ luôn sử dụng CPU cho việc này. Bằng mọi cách hãy tính toán mật độ trên các shader, nhưng vẫn sử dụng card đồ họa để kết xuất.


Vấn đề chính chúng tôi gặp phải là rào cản GPU-CPU. Theo nghĩa, một khi chúng ta tạo và hiển thị địa hình trên GPU, làm thế nào để chúng ta tìm ra địa hình trông như thế nào ở phía CPU của mọi thứ để thực hiện va chạm và những thứ khác. Tôi cho rằng suy nghĩ của bạn về việc giữ nó trên CPU là hợp lệ. Ý tôi là, có lẽ chúng ta có thể tối ưu hóa thuật toán của mình khá nhiều và tạo ra ít địa hình hơn. Tôi sẽ đánh dấu phản hồi của bạn là giải pháp trong một hoặc hai ngày để xem có ai có phản hồi không. Cảm ơn đã kích động một số suy nghĩ thay thế.
Michael J. Gray

Với ví dụ chèo thuyền của bạn, bạn sẽ không dễ dàng kết nối kết quả dạng sóng của một chiếc thuyền văng qua sóng với GPU phải không?
giảm tốc

1
Bạn có thể giữ cùng một hệ thống kết xuất, tức là tạo và kết xuất địa hình trên GPU, nhưng phản chiếu các phần của địa hình bạn cần trên CPU. Sử dụng cùng một thuật toán và cùng các tham số, bạn sẽ có cùng địa hình trên CPU như bạn thấy trên màn hình.
Hannesh

@Daniel Không phải với thuật toán sóng trực tiếp, nhưng có thể làm biến dạng lưới nước theo sự đánh thức của thuyền với kết cấu dịch chuyển mà mỗi thuyền "kéo" phía sau nó.
Hannesh

Ah! Đó là một ý tưởng tuyệt vời :). Nhưng nó có thể không hỗ trợ nhiều tàu thủy rất tốt.
giảm tốc
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.