XNA中的像素完美渲染

时间:2014-03-08 18:30:59

标签: c# xna 2d rendering

我在XNA中有一个2D游戏,它有一个滚动相机。不幸的是,当屏幕移动时,我可以看到一些瑕疵 - 主要是模糊和屏幕上的其他线条。

我考虑过在绘制之前更改坐标(一致地用Ceiling()Floor()逼近),但这似乎有点低效。这是唯一的方法吗?

我使用SpriteBatch进行渲染。

这是我在Camera中的绘图方法:

Vector2D适用于双打,Vector2适用于浮点数(由XNA使用),Srpite只是一个包含spriteBatch.Draw数据的类。

public void DrawSprite(Sprite toDraw)
{
    Vector2D drawingPostion;
    Vector2 drawingPos;
    drawingPostion = toDraw.Position - transform.Position;
    drawingPos.X = (float) drawingPostion.X*UnitToPixels;
    drawingPos.Y = (float) drawingPostion.Y*UnitToPixels;

    spriteBatch.Draw(toDraw.Texture, drawingPos, toDraw.Source, toDraw.Color,
        toDraw.Rotation, toDraw.Origin, toDraw.Scale, toDraw.Effects, toDraw.LayerDepth + zsortingValue);
}

我的想法是这样做:

drawingPos.X = (float) Math.Floor(drawingPostion.X*UnitToPixels);
drawingPos.Y = (float) Math.Floor(drawingPostion.Y*UnitToPixels);

它解决了这个问题。我想我可以这样接受它。但还有其他选择吗?

2 个答案:

答案 0 :(得分:2)

GraphicsDevice.SamplerStates[0] = SamplerState.PointWrap; 

这不是您的相机的问题,因为它是采样器。使用点采样器状态告诉视频卡根据位置直接从纹理中采集单点颜色样本。其他默认模式(如LinearWrap和LinearClamp)将在纹素(源纹理上的像素)之间进行插值,并为其提供非常模糊,模糊的外观。如果您要使用像素图形,则需要点采样。

使用线性插值,如果纹理中的红色和白色相邻,并且在两者之间(通过相机的某个方面)进行采样,则会变为粉红色。通过点采样,您可以获得红色或白色。介于两者之间。

答案 1 :(得分:-1)

是的,有可能......试试这个......

bool redrawSprite = false;
Sprite toDraw;

void MainRenderer()
{
   if (redrawSprite)
   {
      DrawSprite(toDraw);
      redrawSprite = false;
   }
}

void ManualRefresh()
{
   "Create or set your sprite and set it to 'toDraw'"
   redrawSprite = true;
}

这样你就可以让主循环像预期的那样完成工作。