Как масштабировать пиксели на экране? - PullRequest
6 голосов
/ 19 июля 2010

Я написал 2D Jump & Run Engine, в результате чего получилось изображение размером 320x224 (320x240). Чтобы сохранить «пиксельное» чувство старой школы, я бы хотел масштабировать полученное изображение на 2, 3 или 4, в соответствии с разрешением пользователя.

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

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

Ответы [ 3 ]

4 голосов
/ 20 июля 2010

Ответ Боба является правильным при изменении режима фильтрации на 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 образец использует цель рендеринга, к которой затем применяет шейдер размытия.Вы можете просто полностью игнорировать шейдер и просто увеличивать масштаб.

3 голосов
/ 04 января 2011

Вы можете использовать эффект пикселизации. Нарисуйте в RenderTarget2D, затем выведите результат на экран с помощью пиксельного шейдера. Существует инструмент под названием Shazzam Shader Editor, который позволяет вам попробовать пиксельные шейдеры, и он включает в себя инструмент, который выполняет пикселизацию: http://shazzam -tool.com /

Это может быть не то, что вы хотели, но это может быть полезно для разрешения режима высокого разрешения и для того же эффекта, независимо от того, какое разрешение было использовано ... Before

After

1 голос
/ 20 июля 2010

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

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.Я на работе, поэтому я пытаюсь вспомнить с головы до головы.Так или иначе, сегодня вечером я подтвердю.

...