2013-04-27 4 views

ответ

4

Все на современном графическом процессоре представлено с использованием шейдера.

Для старого немедленного рендеринга (то есть: glBegin/glVertex), который преобразуется в нечто, приближающееся к буферам и шейдерам где-нибудь в драйвере. Вот почему использование GLSL «быстрее» - потому что оно ближе к металлу, вы не проходите через конверсионный слой.

Для современного API, такого как XNA, все уже построено вокруг «буферов и шейдеров».


В XNA SpriteBatch предоставляет свой собственный шейдер. Исходный код для шейдера: available here. Сам шейдер очень simple: Вершинный шейдер представляет собой одномерное умножение матрицы для преобразования вершин в правильные растровые объекты. Шейдер пикселей просто отображает текстуру вашего спрайта.

Вы не можете много сделать, чтобы сделать шейдер SpriteBatch быстрее - ему почти ничего не остается. Есть несколько вещей, которые вы можете сделать, чтобы сделать буферизацию более быстрым в определенных обстоятельствах (например: если ваши спрайты не меняются между кадрами), но это своего рода продвинутый. Если у вас возникли проблемы с производительностью с SpriteBatch, убедитесь, что вы using it properly in the first place. Для чего он делает, SpriteBatch уже очень хорошо оптимизирован.

Для получения дополнительной информации об оптимизации см. this answer.


Если вы хотите передать пользовательский шейдер в SpriteBatch (например: для особого эффекта) используют this перегрузку Begin и передать в соответствующем Effect.

Смежные вопросы