当在HLSL中偏离像素中心时,Tex2D返回插值值

时间:2018-11-07 20:06:57

标签: shader hlsl pixel-shader

Tex2D函数在偏离像素中心(例如((0.5,0.5)))时返回插值,当您具有1920x1080之类的大纹理时,这确实是一个问题。

我有一个HLSL像素着色器,它首先对一幅小图像进行采样,然后在一个大的查找表(1920x1080)中计算相应的像素并对其进行采样。问题在于,浮点精度误差使得无法击中像素死点,因此它返回的颜色是与相邻像素插值的。

我该如何克服这个问题?我可以将其设置为不在采样器中插值吗?

编辑:

显然,我可以使用内部函数tex2Dproj,在该函数中,我将x和y坐标预先除以1.92和1.08,然后将1000作为t.w参数传递,以避免任何明显的浮点精度错误。但是我似乎必须这样做很奇怪。

1 个答案:

答案 0 :(得分:0)

采样器过滤器的默认值为LINEAR使其内插。要在不进行插值的情况下制作纹理样本,您需要执行以下操作:

texture2D ColorMap;
sampler2D ColorMapSampler = sampler_state
{
    texture = <ShadowMap>;
    AddressU = clamp;
    AddressV = clamp;
    magfilter = POINT;
    minfilter = POINT;
    mipfilter = POINT;
};

让我震惊的是,我只有这种纹理问题。我正在使用MonoGame,并在着色器外部将SamplerState设置为PointClamp,但仅用于第一个纹理GraphicsDevice.SamplerStates[0] = SamplerState.PointClamp;。如果您有多个纹理,最好为着色器中的每个纹理明确声明它。