Оттянуты ли вызовы SpriteBatch XNA? - PullRequest
0 голосов
/ 17 августа 2011

У меня очень тонкая проблема с XNA, особенно с SpriteBatch.В моей игре у меня есть класс камеры.Он может перевести вид (очевидно), а также увеличивать и уменьшать масштаб.Я применяю камеру к сцене, когда вызываю функцию «Начало» моего экземпляра spritebatch (последний параметр).

Проблема: Когда коэффициент масштабирования камеры больше 1,0f, spritebatch прекращает рисовать.Я попытался отладить свою сцену, но не смог найти точку, где она идет не так.

Я попытался просто выполнить рендеринг с помощью "Matrix.CreateScale (2.0f);"как последний параметр для «Begin».Все остальные параметры были нулевыми и первыми «SpriteSortMode.Immediate», поэтому никаких пользовательских шейдеров или чего-то еще.Но SpriteBatch все еще не хотел рисовать.

Затем я попытался вызвать только «DrawString», и DrawString работала безупречно с предоставленным масштабом (2.0f).

Однако, через многометодом проб и ошибок я обнаружил, что умножение ScaleMatrix на «Matrix.CreateTranslation (0, 0, -1)» каким-то образом изменило «безопасное» значение на 1.1f.Так что все значения Scale до 1.1f работали.Для всего вышеперечисленного SpriteBatch не отображает ни одного пикселя при обычных вызовах Draw.(DrawString все еще не работает и работает).

Почему это происходит?Я не настраивал никакую область просмотра или другие матрицы.Мне кажется, что это может быть какая-то странная ближняя / Farclipping.Но я обычно знаю эти параметры только из 3D-материалов.

Если что-то неясно, спросите!

1 Ответ

2 голосов
/ 17 августа 2011

Это почти / далеко отсечение.

Все, что вы рисуете, преобразуется, а затем растеризуется в пространстве проекции.Это пространство простирается от (-1, -1) в нижнем левом углу экрана до (1,1) в верхнем правом углу.Но это только координаты (X, Y).В координатах Z он идет от 0 до 1 (спереди назад).Все, что находится за пределами этого тома, обрезано.(Ссылки: 1 , 2 , 3 .)

При работе в 3D используемая матрица проекции сжимаетZ координаты вниз, так что ближняя плоскость приземляется в 0 в проекционном пространстве, а дальняя плоскость приземляется в 1.

При работе в 2D вы обычно используете Matrix.CreateOrthographic, который имеет параметры ближней и дальней плоскости, которыесделать точно так же.Просто SpriteBatch определяет свою собственную матрицу и оставляет ближнюю и дальнюю плоскости в 0 и 1.

Вершины спрайтов в SpriteBatch на самом деле имеют Z-координату, хотяэто обычно не используется.Это указывается параметром layerDepth.Таким образом, если вы установите глубину слоя больше 0,5, а затем увеличитесь на 2, координата Z будет вне допустимого диапазона от 0 до 1 и не будет отображаться.

(в документации сказано, чтоОт 0 до 1 является допустимым диапазоном, но не определяет, что происходит при применении матрицы преобразования.)

Решение довольно простое: не масштабируйте Z-координату.Используйте масштабную матрицу, например:

Matrix.CreateScale(2f, 2f, 1f)
...