2012-02-09 3 views
18

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

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

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

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

+8

+1 для спрайта управления звездой. – Rotem

ответ

15

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

+5

Я использовал метод таким образом после поиска значений по умолчанию в MSDN: 'spriteBatch.Begin (SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.PointClamp, DepthStencilState.None, RasterizerState.CullCounterClockwise);' и он отлично работает , Благодаря! – Acidic

5

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

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

Я просто использую метод 'spriteBatch.Draw (...)'. Оба рисуя его на более крупный прямоугольник и используя свойство «scale», приводят к этому эффекту. – Acidic

+0

@Acidic обновлен. SpriteBatch предоставляет свойство для установки метода фильтра. –

+0

Попытка изменить значение 'SamplerStates [0].Фильтр "приводит к ошибке, заявляя, что это свойство только для чтения. – Acidic

0

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

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

+0

рисунок с объектом «Прямоугольник» все еще создает нежелательный эффект. Вопрос все равно был отвечен. :) – Acidic

Смежные вопросы