Sprite sheet dengan objek buffer dan shader

9

Apa cara "terbaik" untuk menangani sprite sheet dengan shader dan buffer? Dalam mode langsung, mudah untuk memodifikasi texcoords sprite ketika digambar, tapi saya tidak tahu bagaimana melakukan ini dengan OpenGL modern. Haruskah saya menyimpan semua texcoords di buffer dan mengubah pointer untuk setiap sprite, atau apakah ada cara yang lebih baik?

uggwar
sumber

Jawaban:

11

Anda selalu dapat membuat buffer looong "vertex; texcoord" diulang. Dan cukup gunakan indeks bagaimana Anda mengatakannya. Ini mungkin paling mudah dan agak mirip dengan apa yang Anda ketahui.

Jika Anda ingin menghemat memori. Ada solusi yang cukup rapi dan memiliki satu sprite dalam buffer dengan menyatukan texcoords dan membuat matriks transformasi UV dan mengirimkannya ke shader Anda dan gandakan texcoords dengan itu (dalam vertex shader).

Anda tidak perlu membuat matriks sendiri jika Anda tidak setuju dengan itu. Anda bisa menggunakan fungsi GL biasa dan membaca matriks dengan glGetFloatvfungsi. Seperti ini:

glGetFloatv (GL_MODELVIEW_MATRIX ,&g_TexCoordMat);

Saya membuat gambar untuk menggambarkannya dengan lebih baik. glTranslate dan glScale dapat dilihat karena mereka hanya bergerak dengan basis ruang UV.

uv spritesheet

Jika Anda tidak tahu cara mengirim matriks ke shader saya dapat membagikan beberapa kode dengan Anda.

Sunting: Menambahkan gambar
(sumber untuk spritesheet yang saya gunakan: funorb.com )

Notabene
sumber
Wow terima kasih! Jawaban sempurna. Saya sangat menyukai solusi ini dan akan melihatnya segera setelah saya kembali dari pekerjaan. :-) Jika saya buntu, saya akan mengganggumu dengan beberapa pertanyaan lagi.
uggwar
Sejauh ini saya akan melihat, menghasilkan satu panggilan draw untuk setiap sprite. Apakah ada cara untuk mengumpulkan sprite ini untuk implementasi yang lebih lancar?
uggwar
@uggwar Gambar instan?
Notabene