Ответ 1
В XNA 4 измените свой SpriteBatch.Begin(), чтобы установить состояние сэмплера SamplerState.PointClamp
Когда я рисую растянутый Texture2D
, пиксели получают эффект Blur-like.
Я хочу использовать "пикселированную" графику в своей игре и хотел бы знать, как отключить ее в пользу простейшего приближения ближайшего соседа.
Я создал эту картинку для иллюстрации: (x4 зум)
Как я могу это сделать?
В XNA 4 измените свой SpriteBatch.Begin(), чтобы установить состояние сэмплера SamplerState.PointClamp
Если вы используете шейдер для рисования изображения, вы можете изменить состояние сэмплера:
sampler2D mySampler = sampler_state
{
Texture=<SomeTexture>;
Filter=POINT;
};
Сэмплирование по точкам должно препятствовать интерполяции графического процессора при выборке изображения, что, вероятно, является причиной вашего поведения сглаживания/размытия.
Если вы используете SpriteBatch
для рисования изображения, вы можете установить фильтр, используя:
Device.SamplerStates[0] = SamplerState.PointClamp;
Кроме того, кажется, что вам, возможно, придется настроить SpriteBatch на использование режима Immediate. Подробнее см. эту статью в MSDN или этот поток на Форумы App Hub.
Вот более ранний поток SO, который, вероятно, будет полезен:
См. эту тему для получения дополнительной информации.
Текстуры отбираются с использованием нормированных координат (0..1, 0..1), а не тексельных координат. GPU найдет четыре самых близких текста для заданной координаты текстуры и интерполирует между ними на основе позиции точки выборки в пределах этого квадрата.
Итак, если у меня есть текстура размером 10 x 10 пикселей, и я пытаюсь читать, скажем, (0,15, 0,15), GPU будет интерполировать между текселями в (1,1), (2,1), (1,2) и (2,2). В этом случае 0,05 должно привести к тому, что результирующий пиксель на экране будет просто средним из четырех окружающих пикселей. Однако, если текстуру отбирали (0,19, 0,19), полученный цвет был бы сильно смещен в сторону текселя в точке (2,2).
Точечная выборка приведет к тому, что графический процессор всегда будет считывать точный цвет из базовой текстуры вместо того, чтобы взвешивать координаты вокруг области образца.
Здесь работает рабочий метод .Draw(), который иллюстрирует все это:
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.Black);
var largeRect = new Rectangle(50, 50, sprite.Width * 3, sprite.Height * 3);
/// start the batch, but in immediate mode to avoid antialiasing
spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.Opaque);
/// set the filter to Point
GraphicsDevice.SamplerStates[0] = SamplerState.PointClamp;
/// draw the sprite
spriteBatch.Draw(sprite, largeRect, Color.White);
/// done!
spriteBatch.End();
// TODO: Add your drawing code here
base.Draw(gameTime);
}
Вам нужно убедиться, что ваши координаты x, y являются целыми. Дробные координаты или размеры приводят к тому, что сглаживание применяется для имитации "дробных" смещений пикселей.
Отсюда размытие.