Tex2D возвращает интерполированные значения, когда вне центра пикселя в HLSL - PullRequest
0 голосов
/ 07 ноября 2018

Функция Tex2D возвращает интерполированные значения, когда они находятся вне центра пикселя ((например, 0,5, 0,5)), это действительно проблема, когда у вас есть большая текстура, такая как 1920x1080.

У меня есть пиксельный шейдер HLSL, который сначала производит выборку небольшого изображения, затем вычисляет соответствующий пиксель в большой справочной таблице (1920x1080) и производит выборку. Проблема состоит в том, что ошибки точности с плавающей точкой делают невозможным попадание в мертвую точку пикселя, поэтому он возвращает цвет, интерполированный с соседними пикселями.

Как я могу преодолеть эту проблему? Могу ли я установить его не интерполировать в сэмплере?

Edit:

Очевидно, я могу использовать встроенную функцию tex2Dproj, где я делю свои координаты x и y заранее на 1.92 и 1.08, а затем передаю 1000 в качестве аргумента t.w, чтобы избежать любых значительных ошибок точности с плавающей точкой. Но мне кажется странным, что я должен это сделать.

1 Ответ

0 голосов
/ 28 ноября 2018

Значением по умолчанию для фильтра сэмплера является 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;. Если у вас есть несколько текстур, лучше объявить их явно для каждой текстуры в шейдере.

...