Tạo các tiêu chuẩn đỉnh được chia sẻ trên GPU


9

Tôi hầu như đã thành công trong việc chuyển việc triển khai Marching Cubes từ CPU sang các shader tính toán OpenGL, nhưng tôi vẫn chưa giải quyết được các quy tắc thông thường và tự hỏi cách tốt nhất để thực hiện.

Việc triển khai của tôi liên quan cụ thể đến các trường có giá trị nhị phân (Tôi đang cố gắng mô hình hóa các hàm fractal 3D chưa có công cụ ước tính khoảng cách), vì vậy phương pháp chênh lệch độ dốc và chuyển tiếp sẽ không hiệu quả. Tôi đã chia sẻ các đỉnh hoạt động và việc triển khai CPU của tôi sử dụng phương pháp của Quilez được mô tả ở đây để tích lũy các quy tắc khuôn mặt lên từng đỉnh lân cận.

Tôi chỉ có thể chuyển việc thực hiện này sang một shader khác, nhưng vấn đề tôi thấy với điều này là số lượng lớn các nguyên tử cần thiết. Vì chúng ta chỉ có thể sử dụng nguyên tử trên các loại số nguyên vô hướng và tôi không thể nghĩ ra cách đóng gói 3 số nguyên đã ký thành 1 theo cách có thể tóm tắt, điều đó có nghĩa là 3 trục * 3 đỉnh = 9 nguyên tử thêm vào mỗi lần gọi shader. Tất nhiên chúng sẽ được lan truyền khắp bộ nhớ, vì vậy nó không giống như đánh một bộ đếm nguyên tử 9 lần, nhưng nó dường như vẫn là một địa ngục.

Một cách khác là chạy một lệnh gọi shader per-polygon và xây dựng danh sách mặt bình thường (tôi có thể đóng gói theo x10y10z10 theo cách này), sau đó một shader per-vertex để tích lũy tất cả các quy tắc của các mặt lân cận. Đây sẽ là một con heo bộ nhớ khổng lồ, không gian lưu trữ của các chỉ số khuôn mặt sẽ cần 12 int mỗi đỉnh để xử lý trường hợp xấu nhất. Ngoài ra còn có vấn đề làm thế nào để ghi vào bộ lưu trữ này mà không cần phải dùng đến nguyên tử để tìm ra có bao nhiêu khuôn mặt đã được viết cho một đỉnh cụ thể.

Bất cứ ai có bất kỳ ý tưởng tốt hơn về cách làm điều này?

Câu trả lời:


5

Đối với một giải pháp duy nhất của nVidia, bạn có thể sử dụng nội tại thêm nguyên tử dấu phẩy động (như NvInterlockedAddFp32) Mở khóa GPU Intrinsics trong HLSL | Nhà phát triển NVIDIA

Tôi đã thử điều này trên 80.000 lưới đỉnh và nó khá nhanh (khoảng 1 hoặc 2 ms trên GTX980M, nếu tôi nhớ chính xác)

Chỉ cần cẩn thận với việc biên dịch các shader của bạn để phát hành để các nội tại hoạt động (do lỗi / giới hạn của nvidia)

Ngoài ra, hãy cẩn thận với việc phân chia đỉnh (ví dụ do sự gián đoạn UV), bạn sẽ phải xử lý chúng nếu không bạn sẽ có các cạnh cứng không mong muốn tại các đường nối UV.


Bởi vì câu hỏi đã cũ nên tôi sẽ hỏi bạn thay vào đó :-) Đối với những gì tôi hiểu chỉ đơn giản là có thông tin phụ thuộc cho mỗi đỉnh không đủ tốt cho tiếng Nga?
Andreas

Đây là dự án luận án của tôi năm ngoái, cuối cùng tôi chỉ đi theo cách ngu ngốc và sử dụng các số nguyên tử bổ sung, tăng tỷ lệ lên để tối đa hóa độ chính xác, sau đó chuẩn hóa thành các vectơ nổi. Không thể tìm ra cách liệt kê các mặt tròn quanh mỗi đỉnh mà không phân bổ không gian trong trường hợp xấu nhất và sử dụng các bộ đếm nguyên tử để tạo danh sách bằng mọi cách. Nó có thể không hiệu quả như địa ngục nhưng tôi vẫn nhận được một số đơn đặt hàng tăng tốc độ từ phiên bản CPU và nhãn hiệu hạng nhất vì vậy tôi đã đủ hạnh phúc với nó :)
russ
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.