Имеет ли смысл использовать собственный алгоритм создания mipmap для текстур OpenGL?
Мне было интересно, было бы лучше качество текстурных mipmaps, если бы я использовал свой собственный алгоритм для их предварительного генерации вместо встроенного автоматического. Я бы, вероятно, использовал медленный, но довольно алгоритм, например, повторную выборку Lanczos.
Имеет ли смысл? Получу ли я качество любого качества на современных видеокартах?
Ответы
Ответ 1
Есть веские причины для создания собственных мип-карт. Однако качество понижающей дискретизации не является одним из них.
Игровые и графические программисты экспериментировали со всеми типами алгоритмов понижающей дискретизации в прошлом. В итоге оказалось, что самые простые "средние четыре пикселя" -метода дают наилучшие результаты. Кроме того, более продвинутые методы в теории математически более правильны, они, как правило, занимают много остроты из мипмапов. Это дает плоский вид (попробуйте!).
Для некоторой (мне непонятной) причины простой средний метод, кажется, имеет лучший компромисс между сглаживанием и сохранением мипмапов.
Тем не менее, вы можете рассчитать свои мипмапы с гамма-коррекцией. OpenGL этого не делает. Это может сделать реальную визуальную разницу, особенно для более темных текстур.
Делать так просто. Вместо того, чтобы усреднять четыре значения вместе следующим образом:
float average (float a, float b, float c, float d)
{
return (a+b+c+d)/4
}
Сделайте это:
float GammaCorrectedAverage (float a, float b, float c, float d)
{
// assume a gamma of 2.0 In this case we can just square
// the components.
return sqrt ((a*a+b*b+c*c+d*d)/4)
}
Этот код предполагает, что ваши цветовые компоненты нормализованы в диапазоне от 0 до 1.
Ответ 2
Что побуждает вас попробовать? Являются ли мипмапы, которые вы в настоящее время плохо генерируете? (т.е. вы посмотрели?) Помните, что ваши результаты будут по-прежнему быть (tri) линейно интерполированными в любом случае, поэтому между тем, что движение часто резко уменьшается, возвращается к улучшенной повторной выборке.
Ответ 3
Это зависит от вида активов, которые вы показываете. Фильтр Lanczos приближается к идеальному фильтру нижних частот, и результаты заметны, если сравнивать карты mip бок о бок. Большинство людей будут ошибочно использовать псевдонимы для резкости - опять же, это зависит от того, содержат ли ваши активы высокие частоты - я определенно видел случаи, когда фильтр коробки не был хорошим вариантом. Но так как карта мипа затем линейно интерполируется, выигрыш может быть не столь заметным. Следует упомянуть еще одно: большинство людей используют фильтр окна и передают результат как вход в следующий этап - таким образом вы теряете как точность, так и визуальную энергию (хотя гамма поможет этому). Если вы можете придумать код, который использует произвольный фильтр (помните, что большинство из них разделены на два прохода), вы, как правило, масштабируете ядро фильтра и создаете уровни карты мига с базовой текстуры, что хорошо.
Ответ 4
В качестве дополнения к этому вопросу я обнаружил, что некоторые совершенно разные mipmapping (а не просто попытки добиться наилучшего качества масштабирования, такие как фильтрация Lanczos) имеют хорошие эффекты для определенных текстур.
Например, на некоторых текстурах, которые должны представлять высокочастотную информацию, я попытался использовать алгоритм, который просто берет один случайный пиксель из четырех, которые рассматриваются для каждой итерации. Результаты во многом зависят от текстуры и того, что она должна передать, но я обнаружил, что она оказывает большое влияние на некоторых; не в последнюю очередь для наземных текстур.
Еще одна попытка, которую я пробовал, - это использовать самые отклоняющиеся четыре пикселя для сохранения контрастов. У него еще меньше применений, но они существуют.
Таким образом, я применил опцию выбора алгоритма mipmapping для каждой текстуры.
EDIT. Я думал, что могу привести некоторые примеры различий на практике. Здесь фрагмент текстуры травы на земле, крайняя левая картинка со стандартным средним mipmapping, а самое правое - рандомизированное mipmapping:
![Случайное mipmapping, трилинейная фильтрация]()
Я надеюсь, что зритель может оценить, сколько "видимых деталей" теряется в усредненном mipmap, и насколько он более плоский, он ищет такую текстуру.
Также для справки здесь приведены те же самые образцы с включенной анизотропной фильтрацией 4 × (при этом трилинейный):
![Случайное mipmapping, 4 × анизотропная фильтрация]()
Анизотропная фильтрация делает разницу менее выраженной, но она все еще существует.