Как mip-mapping работает с текстурами не-степени-2?

12

Я слышал, что все последние графические процессоры поддерживают текстуры не-power-2, и все функции просто работают. Однако я не понимаю, как mip-mapping будет работать в таком сценарии. Может кто-нибудь объяснить?

ap_
источник

Ответы:

13

Правило состоит в том, что для вычисления следующего размера mipmap вы делите на два и округляете до ближайшего целого числа (если только оно не округляется до 0, в этом случае вместо 1). Например, изображение размером 57x43 будет иметь такие карты:

level 0: 57x43
level 1: 28x21
level 2: 14x10
level 3: 7x5
level 4: 3x2
level 5: 1x1

УФ-картирование, выбор LOD и фильтрация работают точно так же, как для текстур со степенью двойки.

Генерация мипов хорошего качества для текстуры с не степенью двойки немного сложнее, так как вы не можете просто усреднить блок пикселей 2x2 для уменьшения во всех случаях. Тем не менее, прямоугольный фильтр 2x2 был не так уж хорош для начала, поэтому рекомендуется использовать лучший фильтр понижающей дискретизации, такой как Mitchell-Netravali, независимо от размера текстуры.

Натан Рид
источник
1
Есть ли разногласие между этим ответом и ответом Джона Калсбека? Соответствует ли реализация обоим описаниям? Если нет, то было бы полезно иметь ссылку на один или другой (или оба, если используются два различных метода, оба).
Трихоплакс
4

Один из способов думать об этом заключается в том, что графические карты часто реализуют текстуры не в виде степени 2, просто дополняя их, пока они не получат степень 2 в каждом направлении. Это заставляет большинство вещей «просто работать»: например, мозаику и аппаратную фильтрацию. Единственное, что нужно изменить, - это преобразование координат текстуры в координаты изображения.

Если реализовано таким образом, очевидно, как сделать mipmapping: ничего не меняется. Даже если у вас есть графический процессор, который поддерживает текстуры не-степени-2 без заполнения, уровни mipmap заканчиваются «заполнением». например, текстура 3х3 будет иметь текстуру 2х2 как lod 1.

Джон Калсбек
источник
Есть ли разногласие между этим ответом и ответом Натана Рида? Соответствует ли реализация обоим описаниям? Если нет, то было бы полезно иметь ссылку на один или другой (или оба, если используются два различных метода, оба).
Трихоплакс
1
@ trichoplax Я думаю, что утверждение Натана о том, что «генерирование мипов хорошего качества для текстуры, не являющейся степенью двойки, немного сложнее», приводит к тому, что наши ответы, по крайней мере, немного расходятся. Одно это, вероятно, заслуживает большей проработки.
Джон Калсбек
1
Я думаю, что проблема здесь в том, что мы путаем логическое положение текселей с их «физическим» расположением в памяти. 1) Пиксели - это дискретные элементы, т. Е. Вам всегда нужно целочисленное измерение, поэтому уменьшение масштаба нечетного измерения означает, что мы должны либо округлять, либо округлять. Так как мы должны округлять, как только получаем текстуру Nx1 или 1xN, имеет смысл всегда округлять. 2) При размещении по физическим адресам весьма распространено дописать текстуру до некоторого «удобного» «шага» размера. Это может быть сделано по двум причинам: a) это может сделать HW более дешевым; b) если заказ P.of.2, Morton прост.
Симон Ф