XNA RenderTarget半像素偏移

时间:2013-11-30 14:46:17

标签: c# xna pixel offset

我遇到过关于DX9的这个很好的解释,因此,当尝试渲染到目标纹理以使用Post Process pixel着色器效果时,XNA关于像素偏移的问题:

自从阅读那篇文章以来,我注意到使用后期处理效果时,我的引擎代码生成的图像有些模糊,不是100%清晰。我确实有跳过后期处理效果的代码,所以它可以在较慢的机器上运行。

我试图实现文章中提供的解决方案,我注意到它在某种程度上确实有所帮助,但是图像仍然没有退出清晰,也就是说,我不相信我在我的实现1:1像素映射渲染代码。

我在后期处理着色器效果中使用以下着色器代码:

PixelShaderStruct vertShader(VertexShaderStruct input)
{
    PixelShaderStruct output;
    input.pos.X -=  halfPixel.X;
    input.pos.Y -=  halfPixel.Y;
    output.position = float4(input.pos, 1);
    output.texCoord = input.texCoord;

    return output;
}

我将以下变量转发为halfPixel变量:

bloom.Parameters["halfPixel"].SetValue(new Vector2(0.5f / (float)Game1.maxX, 0.5f / (float)Game1.maxY));

MaxXMaxY是当前使用的分辨率的正确整数。

我使用此代码实现了以下结果。

没有后期处理着色器: http://i690.photobucket.com/albums/vv263/Eudaimonium/3D%20Renderings/test2_zps1fb27bcf.png 尽可能清脆。

但是,使用后期处理着色器(因此,使用多个渲染到目标的通道): http://i690.photobucket.com/albums/vv263/Eudaimonium/3D%20Renderings/test1_zps64a20018.png

正如您可以通过白色边框的轮廓看到的那样,边缘的左下边框像素看起来有些清晰,但在右上方向模糊,导致结果不正确。

我确保MSAA在游戏开始时关闭,每个分辨率都会改变。

我无法弄清楚出了什么问题。

1 个答案:

答案 0 :(得分:0)

我认为您错过了所链接文章中的相关段落:

  

注意,当我说“从位置减去一个半像素”时,我的意思是“将四边形的位置向左上方移动半个像素。要做到这一点,你实际上添加(-1 /宽度,+ 1 /高度)。符号( - ,+)的原因是你左右移动。在投影后空间中,保留-x,+ y向上。它是1 /宽度而不是0.5 /宽度的原因是因为,在剪辑空间中,坐标范围从-1到1(宽度2),而不是像纹理一样从0到1(宽度1),所以你需要加倍运动来解释这一点。

所以改变

input.pos.X -= halfPixel.X;
input.pos.Y -= halfPixel.Y;

input.pos.X -= halfPixel.X;
input.pos.Y += halfPixel.Y;

并使用(1f / width, 1f / height)作为halfPixel值。