我遇到过关于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));
MaxX
和MaxY
是当前使用的分辨率的正确整数。
我使用此代码实现了以下结果。
没有后期处理着色器: 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在游戏开始时关闭,每个分辨率都会改变。
我无法弄清楚出了什么问题。
答案 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
值。