首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XNA RenderTarget半像素偏移量

XNA RenderTarget半像素偏移量
EN

Stack Overflow用户
提问于 2013-11-30 14:46:16
回答 1查看 866关注 0票数 0

我遇到了关于DX9的这个很好的解释,因此,XNA在尝试渲染到目标纹理以使用后处理像素着色器效果时,捕捉到了像素偏移:

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

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

在我的后处理着色效果中,我使用了以下着色代码:

代码语言:javascript
复制
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变量转发:

代码语言:javascript
复制
bloom.Parameters["halfPixel"].SetValue(new Vector2(0.5f / (float)Game1.maxX, 0.5f / (float)Game1.maxY));

对于当前使用的分辨率,MaxXMaxY始终是正确的整数。

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

没有后处理着色器:zps1fb27bcf.png就像它得到的一样清晰。

但是,使用后处理着色器(因此,使用多个呈现到目标传递):zps64a20018.png

从白色的边框轮廓中可以看到,边框的左下角像素有点清晰,但在右上方向模糊,结果不正确。

我已经确保MSAA在比赛开始时被关闭,每一个决议都会改变。

我不知道出了什么问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-02 18:26:22

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

注意,当我说“从位置减去半像素”时,我的意思是“将四像素半像素的位置移向左上角。”为此,您实际上添加了(-1/宽度,+1/高度)。出现这些符号(-,+)的原因是你正在向左移动。在投影后空间中,-x左边,+y向上.它是1/宽度而不是0.5/宽度的原因是,在剪辑空间中,坐标范围从-1到1(宽度2),而不是从0到1(宽度1),就像它们在纹理中所做的那样,所以您需要加倍移动才能考虑到这一点。

所以改变

代码语言:javascript
复制
input.pos.X -= halfPixel.X;
input.pos.Y -= halfPixel.Y;

代码语言:javascript
复制
input.pos.X -= halfPixel.X;
input.pos.Y += halfPixel.Y;

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20301559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档