Pour être plus précis, si j'avais besoin de recréer cette fonctionnalité à partir de zéro dans une autre API (par exemple, dans OpenGL), de quoi aurait-elle besoin?
J'ai une idée générale de certaines étapes, par exemple comment préparer une matrice de projection orthographique et créer un quad pour chaque appel de tirage.
Je ne connais toutefois pas trop le processus de traitement par lots lui-même. Est-ce que tous les quads sont stockés dans le même vertex buffer? A-t-il besoin d'un tampon d'index? Comment sont traitées les différentes textures?
Si possible, merci de me guider tout au long du processus, à partir du moment où SpriteBatch.Begin () est appelé jusqu'à SpriteBatch.End (), du moins lorsque vous utilisez le mode différé par défaut.
la source
Réponses:
J'ai en quelque sorte reproduit le comportement de SpriteBatch en mode différé pour un moteur multiplate-forme sur lequel je travaille. Voici donc les étapes pour lesquelles j'ai effectué une ingénierie inverse jusqu'à présent:
Constructeur SpriteBatch: crée un
DynamicIndexBuffer
,DynamicVertexBuffer
et un ensemble de laVertexPositionColorTexture
taille fixe (dans ce cas, la taille du lot maximale - 2048 pour les sprites et 8192 pour les sommets).SpriteInfo
structures est également créé. Cela stockera les paramètres de sprite temporels à utiliser lors de la mise en lot.SpriteBatch.Begin: stocke en interne les valeurs de
BlendState
,SamplerState
etc. spécifiées et vérifie si elle a été appelée deux fois sansSpriteBatch.End
intermédiaire.SpriteBatch.Draw: prend toutes les informations sur les sprites (texture, position, couleur) et les copie dans un fichier
SpriteInfo
. Si la taille maximale du lot est atteinte, le lot entier est dessiné pour laisser la place à de nouveaux sprites.SpriteBatch.DrawString
émet simplement unDraw
pour chaque caractère de la chaîne, en tenant compte du crénage et de l'espacement.SpriteBatch.End: effectue les opérations suivantes:
Begin
.SpriteBatch
shader.DynamicVertexBuffer
etDynamicIndexBuffer
.Effectue l'opération de mise en lot suivante:
SpriteBatch.RenderBatch: exécute les opérations suivantes pour chacun des
SpriteInfo
lots du lot:SpriteEffects
.VertexPositionColorTexture
éléments créés précédemment. Lorsque tous les sprites ont été calculés,SetData
est appelé surDynamicVertexBuffer
et unDrawIndexedPrimitives
appel est émis.la source
SpriteSortMode.Texture
pour dessiner dans l'ordre que vous voulez et laissez-lesSpriteBatch
faire le tri.SpriteBatch
pour plus de commodité. Et oui, il nécessite MonoTouch / MonoDroid car tout est en C #!Je veux juste souligner que le code XNA SpriteBatch a été porté sur DirectX et publié en tant que logiciel libre par un ancien membre de l'équipe XNA. Donc, si vous voulez voir exactement comment cela fonctionne dans XNA , c'est parti.
la source