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?