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
,DynamicVertexBuffer
y la matriz deVertexPositionColorTexture
de tamaño fijo (en este caso, el tamaño de lote máximo - 2048 para los sprites y 8192 para vértices).SpriteInfo
se 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
,SamplerState
etc. especificados y comprueba si se ha llamado dos veces sin unSpriteBatch.End
intermedio.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.DrawString
solo emite unDraw
para cada carácter de la cadena, teniendo en cuenta el interletraje y el espaciado.SpriteBatch.End: realiza las siguientes operaciones:
Begin
.SpriteBatch
sombreador.DynamicVertexBuffer
yDynamicIndexBuffer
.Realiza la siguiente operación de procesamiento por lotes:
SpriteBatch.RenderBatch: ejecuta las siguientes operaciones para cada uno de
SpriteInfo
los lotes:SpriteEffects
a ellas.VertexPositionColorTexture
elementos creados previamente. Cuando se han calculado todos los sprites,SetData
se llama alDynamicVertexBuffer
yDrawIndexedPrimitives
se emite una llamada.fuente
SpriteSortMode.Texture
para dibujar en el orden que desee y deje queSpriteBatch
haga la clasificación.SpriteBatch
por 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