Как работает SprintBatch от XNA?

Чтобы быть более точным, если мне нужно было воссоздать эту функциональность с нуля в другом API (например, в OpenGL), что ей нужно было бы сделать?

У меня есть общее представление о некоторых шагах, например, как он готовит матрицу ортографических проекций и создает квад для каждого вызова рисования.

Я не слишком хорошо знаком с процессом пакетной обработки. Все квадранты хранятся в одном буфере вершин? Нужен ли ему индексный буфер? Как обрабатываются различные текстуры?

Если возможно, я был бы признателен, если бы вы могли вести меня через процесс, когда SpriteBatch.Begin () вызывается до SpriteBatch.End (), по крайней мере, при использовании режима депертуры по умолчанию.

38 голосов | спросил David Gouveia 17 SatEurope/Moscow2011-12-17T17:23:36+04:00Europe/Moscow12bEurope/MoscowSat, 17 Dec 2011 17:23:36 +0400 2011, 17:23:36

2 ответа


42

У меня есть репликация поведения SpriteBatch в режиме отложенной работы для кросс-платформенного механизма, над которым я работаю, поэтому вот шаги, которые я разработал до сих пор:

  1. Конструктор SpriteBatch: создает DynamicIndexBuffer, DynamicVertexBuffer и массив VertexPositionColorTexture фиксированного размера (в данном случае , максимальный размер партии - 2048 для спрайтов и 8192 для вершин).

    • Буфер индекса заполняется индексами вершин квадратов, которые будут нарисованы (0-1-2, 0-2-3, 4-5-6, 4-6-7 и т. д.).
    • Создается внутренний массив структур SpriteInfo. Это сохранит параметры временного спрайта, которые будут использоваться при пакетной обработке.
  2. SpriteBatch.Begin: внутренне сохраняет значения SpriteInfo, BlendState и т. д., указанные и проверяет, была ли она вызвана дважды без SamplerState между ними.

  3. SpriteBatch.Draw: берет всю информацию об спрайте (текстуру, положение, цвет) и копирует ее в SpriteBatch.End. Если максимальный размер партии достигнут, вся партия рисуется, чтобы освободить место для новых спрайтов.

    • SpriteInfo просто выдает SpriteBatch.DrawString для каждого символа строки с учетом кернинга и интервала.
  4. SpriteBatch.End: выполняет следующие операции:

    • Устанавливает состояния визуализации, указанные в Draw.
    • Создает матрицу орфографической проекции.
    • Применяет шейдер Begin.
    • Привязывает SpriteBatch и DynamicVertexBuffer.
    • Выполняет следующую операцию дозирования:

       DynamicIndexBuffer
  5. SpriteBatch.RenderBatch: выполняет следующие операции для каждого из 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(); в пакете:

    • Занимает положение спрайта и вычисляет конечное положение четырех вершин в соответствии с началом и размером. Применяет существующее вращение.
    • Вычисляет UV-координаты и применяет к ним указанный SpriteInfo.
    • Копирует цвет спрайта.
    • Эти значения затем сохраняются в массиве ранее созданных элементов SpriteEffects. Когда вычисляются все спрайты, VertexPositionColorTexture вызывается в SetData и вызывается DynamicVertexBuffer.
    • Вершинный шейдер выполняет только операцию трансформирования, а пиксельный шейдер применяет тонирование на цвете, выбранном из текстуры.
ответил r2d2rigo 18 SunEurope/Moscow2011-12-18T06:08:07+04:00Europe/Moscow12bEurope/MoscowSun, 18 Dec 2011 06:08:07 +0400 2011, 06:08:07
13

Просто хочу отметить, что код XNA SpriteBatch был перенесен в DirectX и выпущен как OSS предыдущим членом команды XNA. Поэтому, если вы хотите посмотреть, как это работает в XNA , здесь вы идете.

ответил ClassicThunder 5 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 05 Sep 2012 00:12:15 +0400 2012, 00:12:15

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132