Para ser más precisos, si tuviera que recrear esta funcionalidad desde cero en otra API (por ejemplo, en OpenGL), ¿qué tendría que ser capaz de hacer?
Tengo una idea general de algunos de los pasos, como cómo prepara una matriz de proyección ortográfica y crea un quad para cada llamada de sorteo.
Sin embargo, no estoy muy familiarizado con el proceso de procesamiento por lotes. ¿Están todos los quads almacenados en el mismo búfer de vértices? ¿Necesita un búfer de índice? ¿Cómo se manejan las diferentes texturas?
Si es posible, agradecería que me guiara a través del proceso desde que se llama a SpriteBatch.Begin () hasta SpriteBatch.End (), al menos cuando se usa el modo diferido predeterminado.
xna
spritebatch
David Gouveia
fuente
fuente

Respuestas:
He replicado el comportamiento de SpriteBatch en modo diferido para un motor multiplataforma en el que estoy trabajando, así que aquí están los pasos que he realizado en ingeniería inversa hasta ahora:
SpriteBatch constructor: crea una
DynamicIndexBuffer,DynamicVertexBuffery la matriz deVertexPositionColorTexturede tamaño fijo (en este caso, el tamaño de lote máximo - 2048 para los sprites y 8192 para vértices).SpriteInfose crea una matriz interna de estructuras. Esto almacenará la configuración de sprites temporales que se utilizará al procesar lotes.SpriteBatch.Begin: almacena internamente los valores de
BlendState,SamplerStateetc. especificados y comprueba si se ha llamado dos veces sin unSpriteBatch.Endintermedio.SpriteBatch.Draw: toma toda la información del sprite (textura, posición, color) y la copia en a
SpriteInfo. Si se alcanza el tamaño máximo de lote, se dibuja todo el lote para dejar espacio para nuevos sprites.SpriteBatch.DrawStringsolo emite unDrawpara cada carácter de la cadena, teniendo en cuenta el interletraje y el espaciado.SpriteBatch.End: realiza las siguientes operaciones:
Begin.SpriteBatchsombreador.DynamicVertexBufferyDynamicIndexBuffer.Realiza la siguiente operación de procesamiento por lotes:
SpriteBatch.RenderBatch: ejecuta las siguientes operaciones para cada uno de
SpriteInfolos lotes:SpriteEffectsa ellas.VertexPositionColorTextureelementos creados previamente. Cuando se han calculado todos los sprites,SetDatase llama alDynamicVertexBufferyDrawIndexedPrimitivesse emite una llamada.fuente
SpriteSortMode.Texturepara dibujar en el orden que desee y deje queSpriteBatchhaga la clasificación.SpriteBatchpor conveniencia. Y sí, ¡requiere MonoTouch / MonoDroid ya que todo es C #!Solo quiero señalar que el código XNA SpriteBatch ha sido portado a DirectX y lanzado como OSS por un miembro anterior del equipo XNA. Entonces, si quieres ver exactamente cómo funciona en XNA, aquí tienes.
fuente