Nếu bạn đang sử dụng một Shader để vẽ các hình ảnh, bạn có thể sửa đổi tình trạng sampler:
sampler2D mySampler = sampler_state
{
Texture=<SomeTexture>;
Filter=POINT;
};
điểm lấy mẫu nên ngăn GPU từ nội suy khi lấy mẫu ảnh, mà có lẽ là yếu tố khiến antialias của bạn/hành vi mờ.
Nếu bạn chỉ sử dụng SpriteBatch
để vẽ các hình ảnh, bạn có thể thiết lập các bộ lọc sử dụng:
Device.SamplerStates[0] = SamplerState.PointClamp;
Ngoài ra, có vẻ như bạn có thể phải thiết lập các SpriteBatch sử dụng chế độ ngay. See this article on MSDN for more information hoặc this thread on the App Hub forums.
Dưới đây là một sớm thread SO rằng có thể sẽ rất hữu ích:
See this thread for more information.
Textures được lấy mẫu sử dụng tọa độ bình thường (0..1, 0..1) chứ không phải là tọa độ Texel. GPU sẽ tìm bốn ô gần nhất cho một tọa độ kết cấu đã cho, và nội suy giữa chúng dựa trên vị trí của điểm mẫu trong hình vuông đó.
Vì vậy, nếu tôi có kết cấu là 10 x 10 pixel và tôi cố đọc từ, (0,15, 0,15), GPU sẽ nội suy giữa các ô tại (1,1), (2, 1), (1,2) và (2,2). Trong trường hợp này, 0,05 sẽ làm cho điểm ảnh kết quả trên màn hình đơn giản là trung bình của bốn điểm ảnh xung quanh. Tuy nhiên, nếu kết cấu được lấy mẫu tại (0,19, 0,19), màu kết quả sẽ bị thiên vị nặng nề đối với texel tại (2,2).
Lấy mẫu điểm sẽ làm cho GPU luôn đọc màu chính xác từ kết cấu bên dưới thay vì trọng số trọng lượng xung quanh khu vực mẫu.
Dưới đây là một .Draw() phương pháp làm việc minh họa tất cả điều này:
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 cho sprite Star Control. – Rotem