Если быть более точным, если бы мне нужно было воссоздать эту функциональность с нуля в другом API (например, в OpenGL), что бы он мог сделать?
У меня есть общее представление о некоторых шагах, например, о том, как она подготавливает матрицу ортографической проекции и создает квад для каждого вызова отрисовки.
Однако я не слишком знаком с самим процессом дозирования. Все ли квады хранятся в одном буфере вершин? Нужен ли для этого индексный буфер? Как обрабатываются разные текстуры?
Если возможно, я был бы признателен, если бы вы могли провести меня через этот процесс с момента вызова SpriteBatch.Begin () до SpriteBatch.End (), по крайней мере, при использовании режима отсроченного по умолчанию.
xna
spritebatch
Дэвид Гувея
источник
источник
Ответы:
Я как бы повторил поведение SpriteBatch в отложенном режиме для кроссплатформенного движка, над которым я работаю, поэтому вот шаги, которые я до сих пор проектировал в обратном порядке:
SpriteBatch конструктор: создает
DynamicIndexBuffer
,DynamicVertexBuffer
и массивVertexPositionColorTexture
фиксированного размера (в данном случае, максимальный размер пакета - 2048 для спрайтов и 8192 для вершин).SpriteInfo
создается внутренний массив структур. Это сохранит временные настройки спрайта, которые будут использоваться при дозировании.SpriteBatch.Begin: внутренне сохраняет значения
BlendState
,SamplerState
и т.д. , указанные и проверки , если она была вызвана дважды безSpriteBatch.End
между ними.SpriteBatch.Draw: берет всю информацию о спрайте (текстуру, положение, цвет) и копирует ее в
SpriteInfo
. Если максимальный размер партии достигнут, вся партия рисуется, чтобы освободить место для новых спрайтов.SpriteBatch.DrawString
просто выдаетDraw
для каждого символа строки, принимая во внимание кернинг и интервалы.SpriteBatch.End: выполняет следующие операции:
Begin
.SpriteBatch
шейдер.DynamicVertexBuffer
иDynamicIndexBuffer
.Выполняет следующую операцию дозирования:
SpriteBatch.RenderBatch: выполняет следующие операции для каждого из
SpriteInfo
пакета:SpriteEffects
к ним.VertexPositionColorTexture
ранее созданных элементов. Когда все спрайты были рассчитаны,SetData
вызываетсяDynamicVertexBuffer
иDrawIndexedPrimitives
вызывается.источник
SpriteSortMode.Texture
рисование в любом порядке и позвольтеSpriteBatch
сортировке.SpriteBatch
для удобства. И да, это требует MonoTouch / MonoDroid, так как это все C #!Просто хочу отметить, что код XNA SpriteBatch был перенесен в DirectX и выпущен как OSS предыдущим членом команды XNA. Итак, если вы хотите увидеть, как именно это работает в XNA, то вы идете.
источник