Есть такая оптимизация трилинейной фильтрации, называющаяся brilinear filtering. Суть в том, что коэффициент интерполяции между мипами ремапится, чтобы интерполировать приходилось поменьше.
Тут подробнее:
https://www.tomshardware.com/reviews/ati,819-7.html
https://patents.google.com/patent/US6995767B1/en
Параметр "Качество фильтрации текстур" в панелях управления AMD и Nvidia как раз регулирует степень применения этой брилинейной фильтрации.
К моему удивлению, эта оптимизация применяется также при вызове textureLod. Я ожидаю, что прописав lod равным 0.1, получу значения из мипа0 и мипа1, смешанные в пропорциях 9:1, но этого не происходит, коэффициент интерполяции ремапится, причем на него влияют настройки в драйвере и анизотропная фильтрация.
Для теста сделал приложение, которое берет текстуру с белым мип0 и черным мип1 и рисует несколько квадов с разной настройкой анизотропной фильтрации и шейдером
gl_FragColor = textureLod( texture1, uv, uv.x ).rgba;
Ожидание - прямоугольники с равномерным градиентом от края до края. Результат:
amd - quality, default, performance
nvidia - quality, default, performance
Кто-нибудь знает, как принудительно отключить брилинейную фильтрацию при использовании textureLod? Может, есть способы бомбить амд и нвидию репортами, чтобы они исправили это в драйвере? К слову, в последних драйверах амд под вин7 такой проблемы не было.
Тестовую программу прикладываю
textureLodTest
ncuxonaT
Не знал что texturelod может быть дробный лод... А если bias покрутить ?
innuendo
> Не знал что texturelod может быть дробный лод... А если bias покрутить ?
Может, конечно. Это texelFetch не может. Если под биасом имеется в виду GL_TEXTURE_LOD_BIAS, то он работает как и должен, на брилинейную фильтрацию не влияет.
ncuxonaT
Понятно... Запутали, демоны :)
innuendo
Просто неосилил =)
textureGrad также подвержен этой ерунде. Получается, из-за этой оптимизации невозможно семплить текстуру с трилинейной фильтрацией и получать предсказуемый результат. Только вручную читать из двух мипов и миксить. И никто не замечал этого годами, удивительное дело.
Мож ieee strict даст хинт компилятору чтоб он ручки свои в код не совал.
ncuxonaT
> Получается, из-за этой оптимизации невозможно семплить текстуру с трилинейной фильтрацией и получать предсказуемый результат.
Да
> И никто не замечал этого годами, удивительное дело.
Я замечал. Увы, тут ничего не сделаешь. Только два раза семплить и руками лерпать
Battle Angel Alita
> Мож ieee strict даст хинт компилятору чтоб он ручки свои в код не совал.
Неа, оно кладет болт на это (по крайней мере у меня раньше клало, мб современные драйвера уже работают не так). ieee strict ксати сильно роняет на дно перфоманс
Нет шансов связаться с драйверописателями и объяснить им, что они не правы?
MrShoor
> Только два раза семплить и руками лерпать
Есть еще вариант при запуске приложения делать тестовый рендер, вытаскивать из него bias и scale, дефайнить их в шейдерах и задавать лод при семплинге как floor(lod) + fract(lod) * scale + bias.
ncuxonaT
> Нет шансов связаться с драйверописателями и объяснить им, что они не правы?
Даже если ты убедишь сегодня драйверописателей всё поправить (хотя для анизотропки это порядочная экономия по перфомансу) - то поправят они сегодня, а старые версии драйвера будут еще исопльзоваться годами, и тебе фикс от драйверописателей никак не поможет сегодня
> Есть еще вариант при запуске приложения делать тестовый рендер, вытаскивать из него bias и scale, дефайнить их в шейдерах и задавать лод в при семплинге как floor(lod) + fract(lod) * scale + bias.
Как по мне стремный вариант. + я не уверен что у тебя не сожрет точность. Я бы тупо 2 раза семплил и лерпал
ncuxonaT
А что мы хотим проучить в итоге ?
MrShoor
> Как по мне стремный вариант. + я не уверен что у тебя не сожрет точность. Я бы тупо 2 раза семплил и лерпал
Почему должна сожраться точность? Можно даже немного упростить выражение, останется lod + fract(lod) * (scale - 1.0) + bias.
innuendo
> А что мы хотим проучить в итоге ?
Хотим, например, в IBL заменить кубемапы на октаэдровую проекцию. Или размытые стекла через семплинг блюреных мипов скринкопии, как в Думе.
Оказывается, еще от разрешения текстуры зависит, включится эта хрень или нет, по крайней мере, на амд. На маленьких не включается. 256х256 - нет, 256х257 - уже да.
MrShoor
> + я не уверен что у тебя не сожрет точность.
Про точность разумное замечание. Коэффициент интерполяции у текстурной фильтрации округляется до 8 бит, к трилинейной это так же относится. Если ремапить лод, может вылезти заметный бандинг. Вот AMD в режиме performance с ремапингом.