Билинейная фильтрация
Билине́йная фильтра́ция — процесс извлечения нескольких пикселей исходной текстуры с последующим усреднением их значений для получения окончательного значения пикселя. Понятие «билинейная фильтрация», точно так же, как и сходное понятие «трилинейная фильтрация», применимо только к двумерным текстурам. Для трёхмерных текстур данное понятие неприменимо, а понятие трилинейной фильтрации имеет другое значение.
Пример исходного кода функции билинейной фильтрации
В коде[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;
}
Примечания
- Язык — C
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.