最近邻居缩放

21
当我拉伸Texture2D时,像素会出现模糊效果。
我想在我的游戏中使用“像素化”图形,并想知道如何禁用此功能,以便使用最简单的最近邻缩放。
我为说明创建了这张图片:(x4缩放)
enter image description here 我该如何实现这个目标?

9
感谢夸赞Star Control精灵,加1支持。 - Rotem
3个回答

17

5
在查阅了MSDN上的默认设置后,我使用了如下方式进行了方法调用:spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.PointClamp, DepthStencilState.None, RasterizerState.CullCounterClockwise); 结果很好。谢谢! - Acidic

6
如果您正在使用着色器绘制图像,您可以修改采样器状态:
sampler2D mySampler = sampler_state
{
    Texture=<SomeTexture>;
    Filter=POINT;
};

点采样可以防止GPU在采样图像时进行插值,这可能是导致您的抗锯齿/模糊行为的原因。

如果您只是使用SpriteBatch绘制图像,则可以使用以下方式设置过滤器:

Device.SamplerStates[0] = SamplerState.PointClamp;

此外,似乎您需要将SpriteBatch设置为使用Immediate模式。请参阅MSDN上的此文或App Hub论坛上的此帖了解更多信息。
以下是一个早期的SO线程,可能会有所帮助:请参阅此线程以获取更多信息。 纹理使用标准化坐标(0..1, 0..1)进行采样,而不是使用像素坐标。 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)处的纹理单元。
点采样会导致GPU始终从底层纹理中读取精确的颜色,而不是在采样区域周围加权坐标。
以下是一个可工作的.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);
    }

我只是使用 spriteBatch.Draw(...) 方法。将其绘制到较大的矩形并使用 scale 属性都会产生这种效果。 - Acidic
@Acidic 已更新。SpriteBatch 提供了一个设置过滤方法的属性。 - 3Dave
试图更改 SamplerStates[0].Filter 的值会导致错误,指出它是只读属性。 - Acidic
@Acidic 又更新了;你需要创建一个新的 SamplerState 对象并将其分配给 device.SamplerStates[0],或者使用预定义的 SamplerState.* 成员之一。 - 3Dave
感谢迄今为止的帮助。我应该在Draw方法中每帧分配它还是在LoadContent方法中分配它?(目前似乎两者都不起作用...) - Acidic
@Acidic 已更新一个可工作的 .Draw 方法,可以将所有内容正确地设置。 - 3Dave

0

你需要确保x和y坐标是整数值。分数坐标或尺寸会导致应用反走样来模拟“分数”像素偏移。

因此发生了模糊。


使用 Rectangle 对象绘图仍然会产生不需要的效果。不过问题已经被回答了。 :) - Acidic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接