Как масштабировать экранные пиксели?

Я записал 2D Механизм Jump&Run, приводящий к 320x224 (320x240) изображение. Для поддержания старой школы "pixely" - чувствуют к нему, я хотел бы масштабировать получающееся изображение 2 или 3 или 4, согласно разрешению пользователя.

Я не хочу масштабировать каждый спрайт, но получающееся изображение!

Заранее спасибо :)

6
задан Hans Passant 19 July 2010 в 17:56
поделиться

2 ответа

Я не совсем понимаю, что вы имеете в виду под "результатом будет ... изображение", но если вы имеете в виду, что конечным результатом будет текстура, то вы можете нарисовать ее на экране и задать масштаб:

spriteBatch.Draw(texture, position, source, color, rotation, origin, scale, effects, depth);

Просто замените масштаб на любое число, которое вам нужно (2, 3 или 4). Я делаю нечто подобное, но масштаб задаю для каждого спрайта, а не для результирующего изображения. Если вы имеете в виду что-то другое, дайте мне знать, и я постараюсь помочь.

XNA по умолчанию сглаживает масштабированное изображение. Если вы хотите сохранить пиксельность, вам нужно рисовать в режиме немедленной сортировки и установить некоторые дополнительные параметры:

spriteBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.Immediate, SaveStateMode.None);
GraphicsDevice.SamplerStates[0].MagFilter = TextureFilter.Point;
GraphicsDevice.SamplerStates[0].MinFilter = TextureFilter.Point;
GraphicsDevice.SamplerStates[0].MipFilter = TextureFilter.Point;

Это либо Point, либо None TextureFilter. Я на работе, поэтому пытаюсь вспомнить на вскидку. Я подтвержу так или иначе позже сегодня.

1
ответ дан 16 December 2019 в 21:33
поделиться

Ответ Боба правильный об изменении режима фильтрации на TextureFilter.Point, чтобы все было красиво и пикселизировано.

Но, возможно, лучший метод, чем масштабирование каждого спрайта (так как вам также придется масштабировать положение каждого спрайта), - это просто передать матрицу в SpriteBatch.Begin, например:

sb.Begin(/* first three parameters */, Matrix.CreateScale(4f));

Это даст вам желаемое масштабирование без необходимости изменять все ваши вызовы рисования.

Однако стоит отметить, что, если вы используете смещения с плавающей запятой в своей игре, вы в конечном итоге получите вещи, не выровненные по границам пикселей после масштабирования (с помощью любого метода).

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

public static Vector2 Floor(Vector2 v)
{
    return new Vector2((float)Math.Floor(v.X), (float)Math.Floor(v.Y));
}

А затем пропускать свою позицию через эту функцию каждый раз, когда вы рисуете спрайт. Хотя это может не сработать, если ваши спрайты используют какое-либо вращение или смещение. И снова вы вернетесь к изменению каждого вызова розыгрыша.

«Правильный» способ сделать это, если вы хотите простую точечную шкалу:вверх всей вашей сцены, чтобы нарисовать вашу сцену до цели рендеринга в исходном размере. А затем нарисуйте целевой объект рендеринга на экране, масштаб которого увеличен (с помощью TextureFilter.Point).

Функция, на которую вы хотите посмотреть, это GraphicsDevice.SetRenderTarget. Эту статью MSDN, возможно, стоит прочитать. Если вы используете или переходите на XNA 4.0, это может стоить прочитать.

Я не смог быстро найти более простой пример XNA для этого, но в примере Bloom Postprocess используется целевой объект рендеринга, к которому затем применяется шейдер размытия. Вы можете просто полностью проигнорировать шейдер и просто выполнить масштабирование.

4
ответ дан 16 December 2019 в 21:33
поделиться
Другие вопросы по тегам:

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