Tôi đang tạo lưới từ dữ liệu thể tích bằng thuật toán Marching Cubes chạy trên CUDA.Cách tối ưu hóa VBO/IBO để tối đa hóa việc sử dụng bộ nhớ cache GPU
Tôi đã thử lưu lưới và hiển thị theo 3 cách.
- lưu tập hợp tam giác thô làm mảng dữ liệu đỉnh liên tục. tôi ước tính kích thước nếu đèo đầu tiên, tạo một OpenGL VBO, bản đồ nó để CUDA và viết dữ liệu đỉnh để nó ở định dạng dưới đây
V0x, V0y, V0z, N0x, N0y, N0z, V1x, V1y, V1z, N1x, N1y, N1z, ...
và vẽ nó bằng cách sử glDrawArrays()
.
Đỉnh dự phòng trong VBO, Đỉnh dự phòng trên mỗi khối, Không có chỉ mục.
- Hãy lưới từ bước 1, sử dụng
thrust::sort()
vàthrust::unique()
để loại bỏ đỉnh không cần thiết, chỉ số tính toán sử dụngthrust::lower_bound()
. lưu kết quả vào một OpenGL VBO/IBO ánh xạ tới CUDA. vẽ mô hình bằng cách sử dụngglDrawElements()
.
Không có đỉnh dự phòng trong VBO, chỉ mục được tạo.
- Tạo danh sách duy nhất các đỉnh trên mỗi hình khối, lưu trữ chúng trong VBO cùng với chỉ mục của chúng tạo thành hình tam giác trong IBO. Render bằng cách sử dụng
glDrawElements()
. Vertices
Redundant trong VBO, Unique Vertices mỗi Cube, chỉ số tạo mỗi Cube
Bây giờ FPS tôi nhận được cho các tập dữ liệu cùng một lúc cùng một tiêu chuẩn ISO-Value `là
Method 1 : 92 FPS, 30,647,016 Verts, 0 Indices
Method 2 : 122 FPS, 6,578,066 Verts, 30,647,016 Indices
Method 3 : 140 FPS, 20,349,880 Verts, 30,647,016 Indices
Mặc dù Phương pháp 2 mang lại số đỉnh tối thiểu, FPS thấp. Tôi tin rằng điều này là do các chỉ số theo thứ tự giảm thiểu việc sử dụng bộ nhớ cache GPU. Thứ tự chỉ số cho phương pháp 3 được sử dụng bộ nhớ đệm GPU cao hơn do đó FPS cao hơn.
Cách sửa đổi/sửa đổi phương pháp 2 để mang lại FPS cao hơn?
Phương pháp đo lường FPS của bạn có tính đến thời gian cần để loại bỏ các đỉnh thừa bằng cách sử dụng lực đẩy không? –
@ m.s. Việc loại bỏ chỉ được thực hiện một lần. Tôi không tìm phương pháp xóa theo thời gian thực.Khi giá trị iso đang được thay đổi, tôi chỉ đơn giản là render lưới thô trong Phương pháp 1. Khi thay đổi là không đổi, sau đó tôi xử lý việc loại bỏ mất khoảng 4 giây. Sau đó tôi chỉ sử dụng VBO/IBO để render lưới. Tôi muốn FPS cao hơn cho lưới này, trong khi chỉ rendering, không khai thác hoặc nén được thực hiện khi tôi đo FPS. – Harish