Если вы используете шейдер для рисования изображения, вы можете изменить состояние сэмплера:
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);
}