Если вы используете затенение для рисования изображения, вы можете изменить состояние сэмплер:
sampler2D mySampler = sampler_state
{
Texture=<SomeTexture>;
Filter=POINT;
};
выборка Точки должна предотвратить GPU от интерполирования при отборе проб изображения, которое, вероятно, что вызывает ваши сглаживать/размытие.
Если вы используете только SpriteBatch
для рисования изображения, вы можете установить фильтр с помощью:
Device.SamplerStates[0] = SamplerState.PointClamp;
Кроме того, кажется, что вы, возможно, придется установить SpriteBatch использовать Immediate режим. See this article on MSDN for more information, или this thread on the App Hub forums.
Вот раньше SO нить, которая, вероятно, будет полезно:
See this thread for more information.
текстуры отбираются с использованием нормированных координат (0..1, 0..1), а не координаты TEXEL. 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);
}
+1 для спрайта управления звездой. – Rotem