Войти
ПрограммированиеФорумГрафика

Помогите понять принцип работы mipmap

Страницы: 1 2 Следующая »
#0
11:13, 18 окт. 2018

Помогите понять принцип работы mipmap. При использовании mipmap в моей программе, изображения деформируются при уменьшении. Во время создания текстуры я использую трилинейную фильтрацию:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);

Загружаю текстуру размером 128x128 пикселей и указываю количество mipmap-уровней:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 10);

Вывожу изображение с помощью VBO. Во фрагментном шейдере использую функцию texture2D для отображения текстуры. При размере квадрата 128px искажений нет, но когда я уменьшаю размер до 85px, появляются проблемы:

1 | Помогите понять принцип работы mipmap

Далее при размере 64px изображение выглядит четко, а при размере 50px снова возникают проблемы:

2 | Помогите понять принцип работы mipmap

При использовании функции textureLod удается добиться хорошего отображения текстуры на прямоугольнике размером от 64px до 128px, если использовать lod = 0:

3 | Помогите понять принцип работы mipmap

Если уменьшить квадрат до размера 50px заметны искажения при lod = 0:

4 | Помогите понять принцип работы mipmap

и при lod = 1 или lod = 2:

5 | Помогите понять принцип работы mipmap

Не понимаю, какой уровень детализации нужно использовать для отображения текстуры на прямоугольнике размером меньше 64px, при загруженной текстуре размером 128px, чтобы избежать искажений. А также, не понимаю, почему функция texture2D по умолчанию при размере квадрата 85px рисует текстуру с искажением. Пробовал использовать нецелочисленные значения lod, а также, параметр bias в функции texture2D, но не смог найти оптимального варианта.

Прошу помощи у тех, кто сталкивался с подобной проблемой.

Тестовая программа | Исходный код тестовой программы


#1
14:04, 18 окт. 2018

Может лучше попробовать заюзать так:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);

glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
glGenerateMipmap(GL_TEXTURE_2D);

И окно делать без бордюра. На весь экран.

#2
14:59, 18 окт. 2018

ronniko
> И окно делать без бордюра. На весь экран.
Это конечно же поможет с мипмапами

#3
15:43, 18 окт. 2018

Shkolota
технология mipmaps предусматривает набор изображений-текстур где каждая последующая текстура вдвое меньше прошлой.
Идея, которая лежит в основе мипмапов довольно проста: после определенного расстояния от наблюдателя, OpenGL будет использовать другую мипмап текстуру,
которая будет лучше выглядеть на текущем расстоянии. Чем дальше от наблюдателя находится объект тем меньше будет использоваться текстура,
поскольку пользователю сложнее будет заметить разницу между разрешениями текстур.
>какой уровень детализации нужно использовать для отображения текстуры на прямоугольнике размером меньше 64px
32px

#4
17:32, 18 окт. 2018

В общем-то тов. Funtik всё правильно написал, только сам смысл этой оптимизации не озвучил. А это оптимизация скорости для видеокарты. Это совсем не очевидно, но большие текстуры накладываются медленнее, чем маленькие. Т.е. если вы на один и тот же треугольник будете накладывать текстуру разных размеров, то большая будет накладываться значительно медленнее (я когда-то давно на спецэффекте замерял FPS с текстурой 512 на 512 и такой же текстурой, но 128 на 128, так, насколько я помню, с маленькой текстурой FPS вырастал раза в 3). Именно поэтому mipmap автоматически подставляет уменьшенную копию текстуры, когда расстояние до камеры большое, и качеством текстуры можно пожертвовать для увеличения скорости рисования.

#5
17:52, 18 окт. 2018

Odin_KG
это вообще-то комплексная оптимизация. это совсем не очевидно, но красиво натянуть большую текстуру на маленький треугольник без большого количества вычислений не получается. а простые алгоритмы дадут ужасное качество.

проблема тут в том, что тут походу трилинейка не включилась. ну, как мне кажется. и неясно почему.

#6
18:14, 18 окт. 2018

Odin_KG
> А это оптимизация скорости для видеокарты.
Не только скорости но и качества.

#7
18:14, 18 окт. 2018

Андрей5000 я знаю точно что в Directx из-за бордюра окна были лесинки на объектах.
Такое не исключаю и в OpenGL
Потому указал как один из моментов, влияющих на качество картинки в окне.

PS: Андрей5000  будешь умничать, натравлю на тебя Eugen-a, он тебя на альфу-коверадж разложит :)

#8
18:27, 18 окт. 2018

ronniko
> Андрей5000 я знаю точно что в Directx из-за бордюра окна были лесинки на
> объектах
Лесенки были не из-за бордюра, а из-за твоих кривых рук. Ты размер бекбуфера выставлял по размеру окна, а не клиентской области.

#9
18:30, 18 окт. 2018

MrShoor

Ты размер бекбуфера выставлял по размеру окна, а не клиентской области.

Это как бы по умолчанию привязано к размеру окна.
Если руки ровнее моих :)

Во всем виноват Франк Луна ! А Роннико делал по его примерам.

#10
19:38, 18 окт. 2018

ronniko
> Это как бы по умолчанию привязано к размеру окна.
Если dx10 и выше - то нет.

#11
19:48, 18 окт. 2018

MrShoor а если DX11, а level = D3D_FEATURE_LEVEL_9_0 ? :)

#12
19:57, 18 окт. 2018

Odin_KG
Быстрее маленькая текстура накладывается только при условии того, что объект тоже маленький. Суть в том, то при выборке из текстурной памяти кэшируется не строка(как в случае глобальной памяти под vbo и др), а область вокруг пиксела. Именно поэтому при использовании мипмапы нет кэш-промахов нет. Драйвер сам рассчитывает подходящий размер текстуры, чтобы тексел на мониторе сответсвовал по размеру пикселу из текстуры. Поэтому при растеризации соседнего тексела, понадобится соседний пиксел и мы попадём в кэш!
А топикстартер вообще генерирует сами мип-мапы?

#13
20:12, 18 окт. 2018

ronniko
> MrShoor а если DX11, а level = D3D_FEATURE_LEVEL_9_0 ? :)
то размер бекбуфера ты сам задаешь, и задавал ты его криво.

#14
22:11, 18 окт. 2018

Odin_KG
Мипы - это в первую очередь про качество картинки, быстродействие - побочный бонус. Ты не сможешь нормально натянуть текстуру 128х128 на квад 32х32, будут пропуски пикселей и в результате будет винегрет, вместо текстуры.

Страницы: 1 2 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.