Cara tercepat untuk menggambar partikel kecil di OpenGL?

8

Pertanyaan cepat: Yang merupakan metode tercepat untuk membuat array besar partikel 4x4 / 8x8 di OpenGL? Saat ini saya menghabiskan 2ririles untuk masing-masing tetapi saya pikir itu lambat jadi saya benar-benar ingin tahu apakah saya melakukannya dengan benar .....

pengguna1010005
sumber
1
Hanya pengingat bahwa karena ini adalah pertanyaan kinerja, Anda harus mengukur kinerja pada platform target Anda, (a) untuk memastikan itu benar-benar cukup mahal untuk dikhawatirkan dan (b) untuk menguji percepatan solusi yang diusulkan.
Nathan Reed

Jawaban:

6

Anda dapat menggambar poin dengan OpenGL.

Anda ingin memanggil glDrawArrays () atau glDrawElements () dengan GL_POINTS (bukan GL_TRIANGLE_STRIP atau apa pun yang Anda gunakan.)

Ini akan menarik poin ke layar berdasarkan pada ukuran titik saat ini, yang dapat Anda atur melalui glPointSize () . Anda juga dapat menambahkan poin ini, tetapi menurut pengalaman saya tidak semua driver / perangkat keras mendukung poin alias.

Anda tidak dapat memberi tekstur titik-titik ini; mereka hanya satu warna.

notlesh
sumber
Terima kasih atas petunjuknya. Apakah Anda tahu kalau saya bisa melakukan Metode GL_POINT dengan shader sehingga saya dapat memetakan tekstur kepada mereka juga?
user1010005
1
Anda dapat menggunakan dengan shader, tetapi hanya ada satu simpul untuk satu titik (di tengah), sehingga Anda mungkin mengalami kesulitan untuk membuat tex coords. stackoverflow.com/questions/5839095/... sepertinya ini berbicara sedikit tentang ini ...
notlesh
Anda dapat mengatur sprite titik dengan GL_POINTS juga.
Mick
1
@ user1010005 Untuk memetakan peta dengan GL_POINTS, Anda dapat melihat ke GL_POINT_SPRITE_ARB. Juga, saya cukup yakin bahwa poin selalu berakhir dengan jumlah piksel yang sama di layar, tidak peduli seberapa dekat atau jauh Anda dari mereka.
kevintodisco
@ktodisco, Anda bisa meneruskan ukuran titik sebagai atribut. Saya mencapai efek bintang yang layak dengan melakukan ini. untuk mengubah ukuran di vert shader, Anda menetapkan variabel gl_PointSize
notlesh
3

Dalam inti OpenGL 3.2 dan di atasnya, shader geometri tersedia untuk digunakan. Untuk memberikan gambaran singkat, Anda hanya akan memberitahu OpenGL untuk menggambar titik-titik yang mewakili posisi partikel Anda, dan titik-titik ini akan melewati vertex shader secara normal, tetapi kemudian ketika mereka sampai ke shader geometri, ia membangun persegi panjang (keluar dua tris) dengan memancarkan simpul ke tahap berikutnya dari pipa. Bersama dengan simpul, Anda secara terprogram dapat menghasilkan koordinat normals dan tekstur.

Karena ini semua dilakukan dalam perangkat keras, saya cukup yakin ini adalah cara tercepat saat ini untuk membuat partikel titik-sprite.

kevintodisco
sumber
1
Ini mungkin solusi yang lebih baik daripada GL_POINTS, tetapi ini tidak akan berfungsi untuk implementasi OpenGL yang lebih lama (dan OpenGL ES).
notlesh
Kedengarannya hebat tetapi saya berencana untuk port game saya ke platform android :(
user1010005
2
@ user1010005 Tip, Anda harus menyebutkan bahwa ketika Anda mengajukan pertanyaan, jadi kami tahu apa kendala untuk bekerja dengan :)
kevintodisco
Saya seorang pemula dengan opengl maaf D:
user1010005
saya akan SUKA melihat geometri shader yang tersedia di OpenGL ES. ) =
notlesh