Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Вопрос про билинейную фильтрацию

Вопрос про билинейную фильтрацию

MikeNewПостоялецwww14 сен. 20185:42#0
Доброго времени суток.

Мне нужно сделать билинейную фильтрацию изображения (размер которого не меняется), много гуглил про нее, но все равно что-то делаю не так.
Попробовал складывать значения четырех соседних пикселей (справа, слева, сверху и снизу) и делить на четыре - изображение сглаживается, но результат отличается от того что дает VK_FILTER_LINEAR.
Чувствую что делается очень просто, но как правильно?

Да еще и информация разная про билинейную фильтрацию, в одном месте написано - надо брать пиксели
1. слева
2. справа
3. снизу
4. сверху

в другом месте написано - надо брать
1. оригинальный пиксель
2. справа
3. снизу
4. справа-снизу.

Где истина?

Правка: 14 сен. 2018 5:43

Iron ManПостоялецwww14 сен. 20186:22#1
MikeNew
> Где истина?
Истина где-то рядом :)
MikeNewПостоялецwww14 сен. 20186:43#2
Iron Man
> Истина где-то рядом :)
Именно так и оказалось. :)
Взял сверху, слева, и сверху слева - получил полно совпадение.
FordPerfectПостоялецwww14 сен. 20186:46#3
Type sample_2d_linear(float x,float y)
{
    int ix=int(floorf(x));
    int iy=int(floorf(y));
    x-=float(ix);
    y-=float(iy);
    Type A00,A01,A10,A11;
    A00=sample_2d_nearest(ix  ,iy  );
    A10=sample_2d_nearest(ix+1,iy  );
    A01=sample_2d_nearest(ix  ,iy+1);
    A11=sample_2d_nearest(ix+1,iy+1);
    Type A0,A1;
    A0=A00*(1.0f-y)+A01*y;
    A1=A10*(1.0f-y)+A11*y;
    Type A=A0*(1.0f-x)+A1*x;
    return A;
}
MikleМодераторwww14 сен. 201810:21#4
MikeNew
Я так понял, нужно решение на CPU? Тут я давал такое:
https://gamedev.ru/flame/forum/?id=135959&page=9#m125
BingoBongoПостоялецwww14 сен. 201810:59#5
По-моему, единственное верное решение - это которое FordPerfect написал.
MikleМодераторwww14 сен. 201811:09#6
BingoBongo
Оно верное, но не единственное. Я дал то же по сути, но сильно оптимизированное, заточенное под ARGB и не теряющее пиксели при уменьшении изображения.

Правка:
Хотя, ты прав, если у меня нечто большее, чем билинейная фильтрация, значит это уже не билинейная фильтрация.

Правка: 14 сен. 2018 11:25

FordPerfectПостоялецwww14 сен. 201811:37#7
Вообще, если речь о именно о текселях, то там ещё сместить может быть надо.
Мой код он про выборку из сетки, а у текселя же центр (sampling point) в (0.5; 0.5), а не в (0; 0).
Type sample_2d_linear(float x,float y)
{
    // (0.5, 0.5) samples texel (0,0) strictly, no contribution from other texels.
    x-=0.5f;
    y-=0.5f;
    int ix=int(floorf(x));
    int iy=int(floorf(y));
    x-=float(ix);
    y-=float(iy);
    Type A00,A01,A10,A11;
    A00=get_texel(ix  ,iy  );
    A10=get_texel(ix+1,iy  );
    A01=get_texel(ix  ,iy+1);
    A11=get_texel(ix+1,iy+1);
    Type A0,A1;
    A0=A00*(1.0f-y)+A01*y;
    A1=A10*(1.0f-y)+A11*y;
    Type A=A0*(1.0f-x)+A1*x;
    return A;
}

/ Форум / Программирование игр / Графика

2001—2018 © GameDev.ru — Разработка игр