Имеет ли смысл использовать собственный алгоритм создания mipmap для текстур OpenGL? - PullRequest
15 голосов
/ 07 мая 2009

Мне было интересно, было бы лучше качество текстурных мип-карт, если бы я использовал собственный алгоритм их предварительной генерации вместо встроенного автоматического. Я бы, вероятно, использовал медленный, но красивый алгоритм, например, повторную выборку Ланцоша.

Имеет ли это смысл? Получу ли я любое улучшение качества на современных видеокартах?

Ответы [ 4 ]

11 голосов
/ 07 мая 2009

Есть веские причины для создания собственных мипмапов. Однако качество понижающей дискретизации не входит в их число.

В прошлом программисты игр и графики экспериментировали со всеми видами алгоритмов понижающей дискретизации. В итоге оказалось, что очень простой метод «в среднем четыре пикселя» дает лучшие результаты. Кроме того, более продвинутые методы теоретически более математичны, они более точные, они, как правило, снимают много резкости с мипмапов. Это дает плоский вид (попробуйте!).

По какой-то (на мой взгляд, непонятной) причине простой метод усреднения, кажется, имеет лучший компромисс между сглаживанием и поддержанием резкости мипмапов.

Однако вы можете рассчитать свои мипмапы с гамма-коррекцией. 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 голосов
/ 16 июля 2011

Это зависит от вида активов, которые вы отображаете. Фильтр Ланцоша приближается к идеальному фильтру нижних частот, и результаты заметны, если сравнить мип-карты рядом. Большинство людей ошибочно принимают псевдонимы за резкость - опять же, это зависит от того, как часто ваши активы содержат высокие частоты - я определенно видел случаи, когда блочный фильтр не был хорошим вариантом. Но так как карта mip тогда все равно линейно интерполируется, усиление может быть не таким заметным. Следует упомянуть еще одну вещь - большинство людей используют блочный фильтр и передают выходные данные в качестве входных данных на следующий этап - таким образом вы теряете как точность, так и визуальную энергию (хотя гамма поможет в этом). Если вы можете придумать код, который использует произвольный фильтр (имейте в виду, что большинство из них можно разделить на два этапа), вы, как правило, масштабируете само ядро ​​фильтра и производите уровни mip-карт из базовой текстуры, что хорошо.

2 голосов
/ 07 мая 2009

Что побуждает вас попробовать? Мипмапы у вас в настоящее время плохо генерируются? (т. е. вы смотрели?) Имейте в виду, что ваши результаты часто все равно будут (три) линейно интерполированы, так что между этими движениями часто возникают круто убывающие возвраты к улучшенной повторной выборке.

1 голос
/ 10 октября 2013

В дополнение к этому вопросу я обнаружил, что некоторые совершенно разные алгоритмы отображения (а не те, которые просто пытаются добиться наилучшего качества уменьшения масштаба, такие как фильтрация Ланцоша) имеют хорошие эффекты для определенных текстур.

Например, на некоторых текстурах, которые должны представлять высокочастотную информацию, я попытался использовать алгоритм, который просто берет один случайный пиксель из четырех, которые рассматриваются для каждой итерации. Результаты во многом зависят от текстуры и от того, что она должна передавать, но я обнаружил, что это дает большой эффект для некоторых; не в последнюю очередь для наземных текстур.

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

Таким образом, я реализовал опцию выбора алгоритма mipmapping для текстуры.

РЕДАКТИРОВАТЬ : Я подумал, что мог бы привести некоторые примеры различий на практике. Вот кусочек текстуры травы на земле, крайняя левая картинка со стандартным средним отображением, а крайняя правая со случайным отображением:

Average mipmapping, trilinear filtering Random mipmapping, trilinear filtering

Надеюсь, зритель сможет оценить, сколько «видимых деталей» теряется в усредненном mipmap и насколько более плоско это выглядит для такой текстуры.

Также для справки, здесь те же образцы с включенной 4-кратной анизотропной фильтрацией (вышеупомянутое является трилинейным):

Average mipmapping, 4× anisotropic filtering Random mipmapping, 4× anisotropic filtering

Анизотропная фильтрация делает разницу менее заметной, но она все еще есть.

...