更准确地说,如果我需要在另一个API(例如OpenGL)中从头开始重新创建此功能,它将需要做什么?
我确实对某些步骤有一个大致的了解,例如它如何准备正交投影矩阵并为每个绘图调用创建一个四边形。
但是,我对批处理过程本身不太熟悉。所有四边形是否存储在同一顶点缓冲区中?是否需要索引缓冲区?如何处理不同的纹理?
如果可以的话,至少在使用默认的Deferred模式时,如果您能指导我完成从SpriteBatch.Begin()到SpriteBatch.End()的整个过程,将不胜感激。
更准确地说,如果我需要在另一个API(例如OpenGL)中从头开始重新创建此功能,它将需要做什么?
我确实对某些步骤有一个大致的了解,例如它如何准备正交投影矩阵并为每个绘图调用创建一个四边形。
但是,我对批处理过程本身不太熟悉。所有四边形是否存储在同一顶点缓冲区中?是否需要索引缓冲区?如何处理不同的纹理?
如果可以的话,至少在使用默认的Deferred模式时,如果您能指导我完成从SpriteBatch.Begin()到SpriteBatch.End()的整个过程,将不胜感激。
Answers:
对于我正在使用的跨平台引擎,我已经在延迟模式下复制了SpriteBatch的行为,因此,这是到目前为止我进行反向工程的步骤:
SpriteBatch构造:创建一个DynamicIndexBuffer
,DynamicVertexBuffer
和的阵列VertexPositionColorTexture
固定大小的(在这种情况下,最大批量大小- 2048为精灵和8192为顶点)。
SpriteInfo
结构数组也被创建。这将存储在批处理时使用的时间精灵设置。SpriteBatch.Begin:在内部存储指定的BlendState
,等值,SamplerState
并检查是否已两次调用它,而SpriteBatch.End
中间没有插入。
SpriteBatch.Draw:获取所有Sprite信息(纹理,位置,颜色)并将其复制到SpriteInfo
。如果达到最大批处理大小,则会绘制整个批处理以腾出空间容纳新的精灵。
SpriteBatch.DrawString
Draw
考虑到字距调整和间距,仅对字符串的每个字符都发出一个。SpriteBatch.End:执行以下操作:
Begin
。SpriteBatch
着色器。DynamicVertexBuffer
和绑定DynamicIndexBuffer
。执行以下批处理操作:
startingOffset = 0;
currentTexture, oldTexture = null;
// Iterate through all sprites
foreach SpriteInfo in SpriteBuffer
{
// Store sprite index and texture
spriteIndex = SpriteBuffer.IndexOf(SpriteInfo);
currentTexture = SpriteInfo.Texture;
// Issue draw call if batch count > 0 and there is a texture change
if (currentTexture != oldTexture)
{
if (spriteIndex > startingOffset)
{
RenderBatch(currentTexture, SpriteBuffer, startingOffset,
spriteIndex - startingOffset);
}
startingOffset = spriteIndex;
oldTexture = currentTexture;
}
}
// Draw remaining batch and clear the sprite data
RenderBatch(currentTexture, SpriteBuffer, startingOffset,
SpriteBuffer.Count - startingOffset);
SpriteBuffer.Clear();
SpriteBatch.RenderBatch:SpriteInfo
对批处理中的每个执行以下操作:
SpriteEffects
。VertexPositionColorTexture
先前创建的元素数组中。计算SetData
完所有子画面后,在上调用并发出DynamicVertexBuffer
一个DrawIndexedPrimitives
调用。SpriteSortMode.Texture
以所需顺序绘制,然后SpriteBatch
进行排序。
SpriteBatch
为了方便起见,我们只是选择重新实现。是的,由于全部为C#,因此需要MonoTouch / MonoDroid!