SpriteBatch
高级 程序员
精灵批次(sprite batch)是一组精灵(带纹理的 2D 平面)的集合。
Note
请记住,你需要将所有自定义代码放在自定义场景渲染器中,才能将其纳入组合。
创建精灵批次
Stride 通过 @'Stride.Graphics.SpriteBatch' 类提供了一种处理精灵批次的简便方式。你可以使用该类高效地重新组合、更新和显示精灵。
**代码:**创建精灵批次
var spriteBatch = new SpriteBatch(GraphicsDevice);
你可以指定批次大小。这不是 SpriteBatch 能显示的最大精灵数,而是它在绘制前能存储的最大精灵数。
**代码:**设置批次大小
var spriteBatch = new SpriteBatch(GraphicsDevice, 2000);
你还可以设置与管线状态页面中讨论的类似状态。
绘制精灵批次
@'Stride.Graphics.SpriteBatch' 类有多个绘制方法用于设置各种参数。有关功能列表,请参阅 @'Stride.Graphics.SpriteBatch' API 文档。
**代码:**绘制精灵批次
// 开始精灵批次操作
spriteBatch.Begin(Game.GraphicsContext, SpriteSortMode.Immediate);
// 立即绘制精灵
spriteBatch.Draw(myTexture, new Vector2(10, 20));
// 结束精灵批次操作
spriteBatch.End();
绘制精灵批次有五种模式。它们在 @'Stride.Graphics.SpriteSortMode' 枚举中列出:
- Deferred(默认模式):精灵在最后同时绘制,以减少绘制调用开销
- Immediate:每次 @'Stride.Graphics.SpriteBatch.Draw*' 调用后立即绘制精灵
- Texture:Deferred 模式的变体,但精灵按其纹理排序,以减少效果参数的更新
- BackToFront:Deferred 模式,按精灵的 z 顺序排序
- FrontToBack:Deferred 模式,按精灵的 z 顺序排序
要设置模式,请在 @'Stride.Graphics.SpriteBatch.Begin*' 方法中指定。
**代码:**精灵批次的延迟绘制
// 开始精灵批次操作
spriteBatch.Begin(Game.GraphicsContext); // 等同于 spriteBatch.Begin(GraphicsContext, SpriteSortMode.Deferred);
// 存储精灵的修改
spriteBatch.Draw(myTexture, new Vector2(10, 20));
// 结束精灵批次操作,绘制所有精灵
spriteBatch.End();
你可以为精灵设置多个参数。例如:
- 位置
- 旋转
- 缩放
- 深度
- 中心偏移
- 颜色着色
完整列表请参阅 @'Stride.Graphics.SpriteBatch' API 文档,尤其是 Draw 方法。
**代码:**更复杂的精灵批次绘制
// 开始精灵批次操作
spriteBatch.Begin(GraphicsContext);
const int gridCount = 10;
var textureOffset = new Vector2((float)graphicsDevice.BackBuffer.Width/gridCount, (float)graphicsDevice.BackBuffer.Height/gridCount);
var textureOrigin = new Vector2(myTexture.Width/2.0f, myTexture.Height/2.0f);
// 在 10x10 网格上绘制 100 个精灵,每个旋转 1.2 弧度、缩放 0.5
for (int y = 0; y < gridCount; y++)
{
for (int x = 0; x < gridCount; x++)
{
spriteBatch.Draw(UVTexture, new Vector2(x * textureOffset.X + textureOffset.X / 2.0f, y * textureOffset.Y + textureOffset.Y / 2.0f), Color.White, 1.2f, textureOrigin, 0.5f);
}
}
// 结束精灵批次操作,绘制所有精灵
spriteBatch.End();