Mówiąc ściślej, gdybym musiał odtworzyć tę funkcję od podstaw w innym interfejsie API (np. W OpenGL), co musiałby być w stanie zrobić?
Mam ogólne wyobrażenie o niektórych etapach, takich jak sposób przygotowania matrycy projekcji ortograficznej i tworzenia quada dla każdego wywołania losowania.
Nie jestem jednak zbyt zaznajomiony z samym procesem wsadowym. Czy wszystkie quady są przechowywane w tym samym buforze wierzchołków? Czy potrzebuje bufora indeksu? Jak obsługiwane są różne tekstury?
Jeśli to możliwe, byłbym wdzięczny, gdybyś mógł poprowadzić mnie przez ten proces od momentu wywołania SpriteBatch.Begin () do SpriteBatch.End (), przynajmniej przy użyciu domyślnego trybu odroczonego.
xna
spritebatch
David Gouveia
źródło
źródło
Odpowiedzi:
W pewnym sensie odtworzyłem zachowanie SpriteBatch w trybie odroczonym dla silnika wieloplatformowego, nad którym pracuję, więc oto kroki, które do tej pory opracowałem metodą wsteczną:
SpriteBatch konstruktor: tworzy
DynamicIndexBuffer
,DynamicVertexBuffer
oraz szeregVertexPositionColorTexture
o ustalonej wielkości (w tym przypadku, maksymalna wielkość partii - 2048 i 8192 dla ikonek na wierzchołkach).SpriteInfo
Tworzona jest również wewnętrzna tablica struktur. Spowoduje to zapisanie tymczasowych ustawień sprite, które będą używane podczas grupowania.SpriteBatch.Begin: wewnętrznie przechowuje wartości
BlendState
,SamplerState
itp określone i sprawdza, czy została ona wywołana dwukrotnie bezSpriteBatch.End
pomiędzy.SpriteBatch.Draw: pobiera wszystkie informacje o ikonce (tekstura, położenie, kolor) i kopiuje je do pliku
SpriteInfo
. Po osiągnięciu maksymalnego rozmiaru partii rysowana jest cała partia, aby zrobić miejsce dla nowych duszków.SpriteBatch.DrawString
po prostu wydaje znakDraw
dla każdego znaku łańcucha, biorąc pod uwagę kerning i odstępy.SpriteBatch.End: wykonuje następujące operacje:
Begin
.SpriteBatch
moduł cieniujący.DynamicVertexBuffer
iDynamicIndexBuffer
.Wykonuje następującą operację grupowania:
SpriteBatch.RenderBatch: wykonuje następujące operacje dla każdej z
SpriteInfo
partii:SpriteEffects
dla nich.VertexPositionColorTexture
wcześniej utworzonych elementów. Po obliczeniu wszystkich ikonekSetData
wywoływany jestDynamicVertexBuffer
iDrawIndexedPrimitives
wywoływane.źródło
SpriteSortMode.Texture
narysować w dowolnej kolejności i pozwólSpriteBatch
sortować.SpriteBatch
dla wygody. I tak, wymaga MonoTouch / MonoDroid, ponieważ jest to wszystko C #!Chcę tylko zaznaczyć, że kod SpriteBatch XNA został przeniesiony do DirectX i wydany jako OSS przez poprzedniego członka zespołu XNA. Jeśli więc chcesz dokładnie zobaczyć, jak to działa w XNA , proszę bardzo.
źródło