Tex2D returns 在 HLSL 中偏离像素中心时的内插值

Tex2D returns interpolated values when off pixel center in HLSL

Tex2D 函数 returns 在偏离像素中心(例如 (0.5, 0.5))时插值,当你有像 1920x1080 这样的大纹理时,这确实是个问题。

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

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

编辑:

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

采样器过滤器的默认值是 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;。如果您有多个纹理,最好为着色器中的每个纹理显式声明它。