Билинейная фильтрация — Википедия

В центре пример билинейной фильтрации

Билине́йная фильтра́ция — процесс, в котором несколько пикселей исходной картинки(в том числе текстуры) усредняются, и благодаря этому получается итоговое изображение. Понятие «билинейная фильтрация», точно так же, как и сходное понятие «трилинейная фильтрация», применимо только к двумерным текстурам. Для трёхмерных текстур данное понятие неприменимо[источник не указан 1816 дней], а понятие трилинейной фильтрации имеет другое значение. Имеет усовершенствованные аналоги, по типу трилинейной фильтрации и анизотропной фильтрации. Имеет заметные переходы между уровнями MIP-текстур.

Пример исходного кода функции билинейной фильтрации

[править | править код]

В коде[1] принимается, что текстура квадратна (наиболее общий случай), а также, что имеется только один канал данных.

 double getBilinearFilteredPixelColor(Texture tex, double u, double v) {    u *= tex.size;    v *= tex.size;    int x = floor(u);    int y = floor(v);    double u_ratio = u - x;    double v_ratio = v - y;    double u_opposite = 1 - u_ratio;    double v_opposite = 1 - v_ratio;    double result = (tex[x][y]   * u_opposite  + tex[x+1][y]   * u_ratio) * v_opposite +                     (tex[x][y+1] * u_opposite  + tex[x+1][y+1] * u_ratio) * v_ratio;    return result;  } 

Тот же пример на языке шейдеров HLSL

float4 Bilinear(sampler2D tex, float2 texCoord, int texSize)  {    float2 trTexCoord = texCoord*texSize;    float2 texf = floor(trTexCoord);    float2 ratio = trTexCoord - texf;    float2 opposite = 1.0 - ratio;    float4 result = (tex2D(tex, texf/texSize) * opposite.x  + tex2D(tex, (texf+float2(1, 0))/texSize)   * ratio.x) * opposite.y +                     (tex2D(tex, (texf+float2(0, 1))/texSize) * opposite.x + tex2D(tex, (texf+float2(1, 1))/texSize) * ratio.x) * ratio.y;    return result;  } 

Примечания

[править | править код]
  1. Язык — C