我遇到了关于DX9的这个很好的解释,因此,XNA在尝试渲染到目标纹理以使用后处理像素着色器效果时,捕捉到了像素偏移:
自从读了那篇文章之后,我确实注意到我的引擎代码产生的图像在使用后处理效果时有点模糊,而不是100%清晰。我确实有跳过post处理效果的代码,所以它可以在速度较慢的机器上运行。
我试着实现了本文中提出的解决方案,我注意到这在某种程度上确实有帮助,但是图像仍然不太清晰,也就是说,我不相信我在渲染代码中实现了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始终是正确的整数。
我正在使用此代码实现以下结果。
没有后处理着色器:zps1fb27bcf.png就像它得到的一样清晰。
但是,使用后处理着色器(因此,使用多个呈现到目标传递):zps64a20018.png。
从白色的边框轮廓中可以看到,边框的左下角像素有点清晰,但在右上方向模糊,结果不正确。
我已经确保MSAA在比赛开始时被关闭,每一个决议都会改变。
我不知道出了什么问题。
发布于 2013-12-02 18:26:22
我认为你错过了你所链接的文章中的相关段落:
注意,当我说“从位置减去半像素”时,我的意思是“将四像素半像素的位置移向左上角。”为此,您实际上添加了(-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值。
https://stackoverflow.com/questions/20301559
复制相似问题