Подтвердить что ты не робот

"Ближайший сосед"

Когда я рисую растянутый Texture2D, пиксели получают эффект Blur-like.

Я хочу использовать "пикселированную" графику в своей игре и хотел бы знать, как отключить ее в пользу простейшего приближения ближайшего соседа.

Я создал эту картинку для иллюстрации: (x4 зум)
enter image description here

Как я могу это сделать?

4b9b3361

Ответ 1

В XNA 4 измените свой SpriteBatch.Begin(), чтобы установить состояние сэмплера SamplerState.PointClamp

Ответ 2

Если вы используете шейдер для рисования изображения, вы можете изменить состояние сэмплера:

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);
    }

Ответ 3

Вам нужно убедиться, что ваши координаты x, y являются целыми. Дробные координаты или размеры приводят к тому, что сглаживание применяется для имитации "дробных" смещений пикселей.

Отсюда размытие.