Geometri shader untuk beberapa primitif

8

Bagaimana saya bisa membuat shader geometri yang dapat menangani beberapa primitif? Misalnya ketika membuat shader geometri untuk segitiga, saya mendefinisikan tata letak seperti:

layout(triangles) in;
layout(triangle_strip, max_vertices=3) out;

Tetapi jika saya menggunakan shader ini maka garis atau poin tidak akan muncul. Jadi menambahkan:

layout(triangles) in;
layout(triangle_strip, max_vertices=3) out;
layout(lines) in;
layout(line_strip, max_vertices=2) out;

Shader akan mengkompilasi dan menjalankan, tetapi hanya akan membuat baris (atau apa pun yang didefinisikan primitif terakhir).

Jadi, bagaimana saya mendefinisikan shader geometri tunggal yang akan menangani beberapa tipe primitif? Atau apakah itu tidak mungkin dan saya perlu membuat beberapa program shader dan mengubah program shader sebelum menggambar setiap jenis?

MichaelHouse
sumber

Jawaban:

7

Saya tidak percaya OpenGL mendukung geometri shaders yang menghasilkan beberapa tipe primitif. Saya sebenarnya terkejut bahwa blok kode kedua Anda dikompilasi ... Mungkin hanya menimpa konfigurasi?

Anda harus membuat beberapa shader dan beralih di antara mereka, setidaknya untuk segitiga / garis dan titik. Sebenarnya ada trik yang dapat Anda lakukan dengan shader fragmen untuk menerima segitiga tetapi hanya membuat garis dengan membuang fragmen yang jatuh terlalu jauh di dalam segitiga menurut koordinat barycentric. Untuk implementasi yang tepat dari itu, saya akan merujuk Anda ke OpenGL Orange Book dan bagian tentang geometri shader dan menggambar wireframe (saya akan kembali dan mengedit setelah saya melacak bab yang tepat).

Selamat coding!

kevintodisco
sumber
2

Tidak mungkin membuat program dengan shader geometri yang menangani beberapa tipe primitif.

Yang sedang berkata, Anda tidak perlu melakukan banyak pekerjaan untuk mendukung beberapa tipe primitif. Berkat ARB_separate_shader_objects , Anda tidak perlu lagi menautkan semua tahapan shader bersama. Anda dapat memiliki satu program hanya vertex, satu program hanya fragmen, dan 2-3 program hanya geometri yang Anda mix-and-match bersama. Selama mereka menggunakan antarmuka yang kompatibel, Anda akan baik-baik saja.

Nicol Bolas
sumber