Saya sebagian besar berhasil porting implementasi Marching Cubes dari CPU ke OpenGL compute shaders, tapi saya belum menangani normals dan bertanya-tanya cara terbaik untuk melakukannya.
Implementasi saya berurusan secara khusus dengan bidang bernilai biner (saya mencoba memodelkan fungsi fraktal 3D yang belum memiliki penduga jarak), sehingga metode perbedaan gradien dan maju tidak akan berfungsi. Saya telah berbagi simpul yang berfungsi, dan implementasi CPU saya menggunakan metode Quilez yang dijelaskan di sini untuk mengakumulasi normals wajah ke setiap simpul tetangga.
Saya hanya bisa mem-port implementasi ini ke shader lain, tetapi masalah yang saya lihat dengan ini adalah banyaknya jumlah atom yang dibutuhkan. Karena kita hanya bisa menggunakan atom pada tipe integer skalar, dan saya tidak bisa memikirkan cara untuk mengemas 3 int yang ditandatangani menjadi 1 dengan cara yang dapat diringkas, itu berarti 3 sumbu * 3 simpul = 9 atom menambah per shader doa. Mereka akan tersebar di seluruh memori tentu saja sehingga tidak seperti memukul counter atom tunggal 9 kali, tetapi masih banyak sekali.
Alternatif lain adalah menjalankan shader invocation per-polygon dan membuat daftar wajah normal (saya mungkin bisa mengemas x10y10z10 dengan cara ini), lalu shader per-vertex untuk mengakumulasikan semua normals dari wajah tetangga. Ini akan menjadi babi memori yang sangat besar, ruang penyimpanan indeks wajah akan membutuhkan 12 int per titik untuk menangani kasus terburuk. Ada juga masalah bagaimana menulis ke dalam penyimpanan ini tanpa lagi menggunakan atom untuk mengetahui berapa banyak wajah yang telah ditulis ke titik tertentu.
Adakah yang punya ide lebih baik tentang bagaimana melakukan ini?
sumber