Untuk lebih tepatnya, jika saya perlu membuat ulang fungsi ini dari awal di API lain (mis. Di OpenGL) apa yang perlu dilakukan?
Saya memang memiliki gagasan umum tentang beberapa langkah, seperti bagaimana mempersiapkan matriks proyeksi ortografis dan membuat quad untuk setiap panggilan draw.
Saya tidak terlalu akrab dengan proses batching itu sendiri. Apakah semua paha depan disimpan dalam buffer vertex yang sama? Apakah perlu buffer indeks? Bagaimana berbagai tekstur ditangani?
Jika memungkinkan, saya akan berterima kasih jika Anda dapat membimbing saya melalui proses dari saat SpriteBatch.Begin () dipanggil hingga SpriteBatch.End (), setidaknya ketika menggunakan mode Deferred default.
xna
spritebatch
David Gouveia
sumber
sumber
Jawaban:
Saya telah mereplikasi perilaku SpriteBatch dalam mode ditangguhkan untuk mesin lintas-platform yang saya kerjakan, jadi inilah langkah-langkah yang telah saya rekayasa terbalik sejauh ini:
Konstruktor SpriteBatch: membuat a
DynamicIndexBuffer
,DynamicVertexBuffer
dan arrayVertexPositionColorTexture
ukuran tetap (dalam hal ini, ukuran batch maksimum - 2048 untuk sprite dan 8192 untuk simpul).SpriteInfo
struct juga dibuat. Ini akan menyimpan pengaturan sprite sementara untuk digunakan saat batching.SpriteBatch.Begin: internal menyimpan nilai-nilai
BlendState
,SamplerState
, dll ditentukan dan memeriksa apakah telah disebut dua kali tanpaSpriteBatch.End
di antara.SpriteBatch.Draw: mengambil semua info sprite (tekstur, posisi, warna) dan menyalinnya ke a
SpriteInfo
. Jika ukuran bets maks tercapai, seluruh bets diambil untuk memberikan ruang bagi sprite baru.SpriteBatch.DrawString
hanya mengeluarkan aDraw
untuk setiap karakter string, dengan mempertimbangkan kerning dan spasi.SpriteBatch.End: melakukan operasi berikut:
Begin
.SpriteBatch
shader.DynamicVertexBuffer
danDynamicIndexBuffer
.Lakukan operasi pengumpulan berikut:
SpriteBatch.RenderBatch: menjalankan operasi berikut untuk masing-masing
SpriteInfo
dalam batch:SpriteEffects
untuk mereka.VertexPositionColorTexture
elemen yang sebelumnya dibuat. Ketika semua sprite telah dihitung,SetData
dipanggilDynamicVertexBuffer
danDrawIndexedPrimitives
panggilan dikeluarkan.sumber
SpriteSortMode.Texture
untuk menggambar dalam urutan apa pun yang Anda inginkan dan biarkanSpriteBatch
melakukan penyortiran.SpriteBatch
demi kenyamanan. Dan ya, itu membutuhkan MonoTouch / MonoDroid karena itu semua C #!Hanya ingin menunjukkan bahwa kode XNA SpriteBatch telah porting ke DirectX dan dirilis sebagai OSS oleh anggota tim XNA sebelumnya. Jadi jika Anda ingin melihat cara kerjanya di XNA, silakan.
sumber