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

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

Страницы: 1 2
#15
23:57, 18 окт. 2018

Shkolota
> Далее при размере 64px изображение выглядит четко, а при размере 50px снова
> возникают проблемы:
артефакты, с которыми ты столкнулся, вообще от мипмаппинга не зависят. представь себе, что у тебя есть изображение размером 4х4 пикселя. ты его можешь скопировать на сетку 4х4 пикселя, сопоставив пиксели просто 1:1. или можешь скопировать его на сетку 2x2 пикселя, усреднив группы по 4 пикселя. а если ты его попытаешься скопировать на сетку, например, 3х3 пикселя, то получится кривота, потому что пиксели ровно друг на друга отобразить не получится, что и выглядит как твоя лесенка. подобные артефакты обычно особенно заметны при рендеринге шрифтов, поэтому их обычно рендерят, используя signed distance map, он немного поможет уменьшить эту проблему.

Odin_KG
> Это совсем не очевидно, но большие текстуры накладываются медленнее, чем маленькие.
"большие текстуры рендерятся медленнее" — это лишь следствие. причина в том, что доступ к текселям текстуры кешируется и если соседние фрагменты на экране читают соседние тексели текстуры, то они кешируются и это гораздо быстрее, чем если они читают удалённые тексели. поэтому если текстура большая, но выполняется когерентность доступа к её текселям, это всё равно будет работать быстрее, чем если ты из маленькой текстуры будешь читать данные некогерентно. мипмапинг работает так, что автоматически сбрасывает детализацию текстуры, "сближая" её удалённые тексели в памяти ровно настолько, насколько нелокально они читаются при рендеринге, где частные производные текстурных координат по экранным координатам используется как метрика нелокальности.

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


#16
5:40, 19 окт. 2018

Трилинейка дает только одно - отсутствие видимых эффектов при смене мип-слоев. Если смотришь не в динамике, этой смены и без нее не увидишь.
За "лесенки" ответственна билинейка, которая может применяться и без мипмапов.

#17
10:50, 19 окт. 2018

Shkolota
> текстуру размером 128x128 пикселей
> glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 10);

В 128х128 столько мип-уровней в принципе быть не может. Это же 2^7.
#18
12:40, 19 окт. 2018

Shkolota
> Помогите понять принцип работы mipmap.
Мизраэль
> Odin_KG
> Мипы - это в первую очередь про качество картинки, быстродействие - побочный бонус.

"Изображение лучше всего выглядит, когда детализация текстуры близка к разрешению экрана. Если разрешение экрана высокое (текстура слишком маленькая/объект очень близко), получается размытое изображение. Если же разрешение текстуры слишком высокое (текстура слишком велика/объект очень далеко), получаем случайные пиксели — а значит, потерю мелких деталей, муар и мерцание. Излишняя детализация плоха и по производительности — излишне нагружает видеошину и даёт большой процент кэш-промахов. Получается, что лучше иметь несколько текстур разной детализации и накладывать на объект ту, которая наиболее подходит в данной ситуации. В отдельных случаях прирост в скорости текстурирования может увеличиваться в тысячи, а скорость вывода всей сцены на экран — в десятки раз."
Из https://ru.wikipedia.org/wiki/MIP-текстурирование

Ключевое помечено.

#19
14:44, 19 окт. 2018

asvp
> Ключевое помечено.
И зачем ты это мне тут написал? Я тоже самое сказал.

Suslik
> а слон — это в первую очередь хобот, а хвост — побочный бонус.
хочешь поговорить об этом?

#20
23:34, 19 окт. 2018

Shkolota
Не могу понять, что не так с твоим проектом, но glTexParameter'ы просто не срабатывают. Даже если воткнуть прямо перед отрисовкой вот это

  glBindTexture(GL_TEXTURE_2D, texture);
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
то текстура всё равно будет рисоваться с  GL_REPEAT и GL_NEAREST_MIPMAP_LINEAR (вроде бы).

upd. Помогло биндить текстуру в ненулевой юнит. То есть добавить glActiveTexture(GL_TEXTURE0 + 1); перед биндингом текстуры при отрисовке и, соответственно, glUniform1i(uniformTextureLoc, 1);
Не знаю, как это работает.
G_85_mipmap | Помогите понять принцип работы mipmap

#21
23:08, 20 окт. 2018

Zab
> С чего ты взял, что я это тебе написал? Тут зачем-то рассуждали включилась
> трилинейка или нет, но она тут ни при чем. И рассуждал не ты.
поправил свой пост, цитирование как-то криво сработало.

#22
13:01, 22 окт. 2018

Огромное спасибо, ncuxonaT, это действительно оказалось решением моей проблемы! По всей видимости, фильтрация не работала, поэтому возникали искажения на текстуре. Теперь я использую glActiveTexture(GL_TEXTURE0 + 1), и все работает, как и должно.

#23
20:11, 22 окт. 2018

Возможно нужно было явно указать семплер, как тут: https://gamedev.ru/code/forum/?id=239135

glBindSampler(0, 0)

#24
0:05, 23 окт. 2018

HolyDel, да, действительно, всё так.
Shkolota, не за что. У тебя там есть строчка glBindSampler(0, vbo.sampler);, она во всём виновата.

Страницы: 1 2
ПрограммированиеФорумГрафика

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