Para ser mais preciso, se eu precisasse recriar essa funcionalidade do zero em outra API (por exemplo, no OpenGL), o que seria necessário?
Eu tenho uma idéia geral de algumas das etapas, como a maneira como ela prepara uma matriz de projeção ortográfica e cria um quad para cada chamada de desenho.
No entanto, não estou muito familiarizado com o próprio processo de lote. Todos os quads são armazenados no mesmo buffer de vértice? Precisa de um buffer de índice? Como são tratadas as diferentes texturas?
Se possível, eu ficaria grato se você pudesse me orientar durante o processo desde quando SpriteBatch.Begin () é chamado até SpriteBatch.End (), pelo menos ao usar o modo Adiado padrão.
xna
spritebatch
David Gouveia
fonte
fonte
Respostas:
Eu meio que repliquei o comportamento do SpriteBatch no modo adiado para um mecanismo de plataforma cruzada em que estou trabalhando, então, aqui estão as etapas que eu fiz a engenharia reversa até agora:
SpriteBatch construtor: cria um
DynamicIndexBuffer
,DynamicVertexBuffer
e de matrizVertexPositionColorTexture
de tamanho fixo (neste caso, o tamanho do lote máximo - 2048 para sprites e 8192 para os vértices).SpriteInfo
é criada uma matriz interna de estruturas. Isso armazenará as configurações de sprite temporal a serem usadas no lote.SpriteBatch.Begin: armazena internamente os valores de
BlendState
,SamplerState
, etc. especificadas e verifica se ele foi chamado duas vezes sem umSpriteBatch.End
no meio.SpriteBatch.Draw: pega todas as informações do sprite (textura, posição, cor) e as copia para a
SpriteInfo
. Se o tamanho máximo do lote for atingido, o lote inteiro será desenhado para abrir espaço para novos sprites.SpriteBatch.DrawString
apenas emite aDraw
para cada caractere da string, levando em consideração o kerning e o espaçamento.SpriteBatch.End: executa as seguintes operações:
Begin
.SpriteBatch
shader.DynamicVertexBuffer
eDynamicIndexBuffer
.Executa a seguinte operação em lote:
SpriteBatch.RenderBatch: executa as seguintes operações para cada um dos
SpriteInfo
lotes:SpriteEffects
a elas especificadas .VertexPositionColorTexture
elementos criados anteriormente. Quando todos os sprites foram calculados,SetData
é chamadoDynamicVertexBuffer
e umaDrawIndexedPrimitives
chamada é emitida.fonte
SpriteSortMode.Texture
para desenhar na ordem que quiser e deixeSpriteBatch
a classificação.SpriteBatch
por conveniência. E sim, requer MonoTouch / MonoDroid, pois é tudo em C #!Só quero salientar que o código XNA SpriteBatch foi portado para o DirectX e lançado como OSS por um membro anterior da equipe do XNA. Então, se você quiser ver exatamente como ele funciona no XNA, aqui está.
fonte