'Ближайший сосед' zoom - PullRequest
       9

'Ближайший сосед' zoom

18 голосов
/ 09 февраля 2012

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

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

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

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

Ответы [ 3 ]

15 голосов
/ 09 февраля 2012

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

5 голосов
/ 09 февраля 2012

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

sampler2D mySampler = sampler_state
{
    Texture=<SomeTexture>;
    Filter=POINT;
};

Точечная выборка должна препятствовать интерполяции графического процессора при выборке изображения, что, вероятно, вызываетповедение сглаживания / размытия.

Если вы просто используете SpriteBatch для рисования изображения, вы можете установить фильтр с помощью:

Device.SamplerStates[0] = SamplerState.PointClamp;

Кроме того, возможно, вам придетсяустановите SpriteBatch для использования немедленного режима. См. Эту статью в MSDN для получения дополнительной информации или в этой теме на форумах App Hub .

Вот более ранняя ветка SO, которая, вероятно, будет полезна:

Дополнительную информацию смотрите в этой теме.

Для выборок текстур используются нормализованные координаты (0..1, 0..1), а не тексельные координаты.Графический процессор найдет четыре ближайших текселя для заданной координаты текстуры и интерполирует между ними, основываясь на положении точки выборки в этом квадрате.

Итак, если у меня есть текстура размером 10 x 10 пикселей, и я пытаюсь читать, скажем, с (0,15, 0,15), графический процессор будет интерполировать между текселями в (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);
    }
0 голосов
/ 09 февраля 2012

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

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

...