Прочитал вот эту статью http://lazyfoo.net/tutorials/OpenGL/08_non_power_of_2_textures/index.php
Что-то никак не пойму в чем суть Power-of-Two Dimensions и Non-Power-of-Two? Что это? Для чего вообще?
Увеличить размер изображения с 520x235 до 1024x256. Смысл?
Смысл в том, что бы MIP считать аппаратно.
http://en.wikipedia.org/wiki/Mipmap
Power of two (POT) (2^N) удобно потому что деление или умножение на такое число эквивалентно сдвигу на N бит двоичного представления числа (вправо или влево соответственно). (ровно как деление или умножение на 10^N есть просто добавление нулей или сдвиг десятичной точки в десятичном представлении). Это упрощало многие формулы.
Synthetic
> Смысл в том, что бы MIP считать аппаратно.
DX позволяет, кстати, юзать NPOT текстуры с NPOT мипами
Mr F
> DX позволяет, кстати, юзать NPOT текстуры с NPOT мипами
А кто не позволяет?
Nawy
> Что это? Для чего вообще?
> Увеличить размер изображения с 520x235 до 1024x256. Смысл?
Как раз наоборот, уменьшить. Если у тебя UI фон типа 1280x1024 при только pow2 храниться много лишнего
Nawy
> Увеличить размер изображения с 520x235 до 1024x256. Смысл?
Смысл в том что раньше видеокарты не поддерживали Non-Power-of-Two текстуры.
Nawy
> Увеличить размер изображения с 520x235 до 1024x256. Смысл?
Иначе мипы не построить, да даже если мипы не нужны - текстурный кеш - одномерный, а доступ к текстуре двумерный. Чтобы эффективно ложить в кеш - данные индексируют по спейсфиллинг кривым ( http://en.wikipedia.org/wiki/Space-filling_curve ), Мортоны там всякие, Гильберты.
По факту же многие карточки эмулируют NPOT через POT текстуры. Часто реально выделяется памяти на гпу под текстуру степени двойки.
MrShoor
> Иначе мипы не построить...
Да почему не построить то? Просто алгоритм заметно усложняется и обрастает ньюансами разного поведения. Но не в сотни раз, а так, с учетом того что мипы строятся раз в десятилетку в общей схеме работы я не вижу мипы серьезной преградой.
Мипы как раз по моему не были главным фактором, а вот сверхбыстрое деление чипы заметно упрощает. Деление это вообще пипец всему в электронике. Если умножение еще можно наскипидарить увеличив ёмкость чипа в тысячи раз (по сравнению со схемой сдвига), то деление это ну вообще ни в борщ ни в красную армию.
Не знаю правда насчёт деления, но допустим у тебя текстурная координата sx плавает от 0 до 1 - всё что нужно чтобы превратить её в целую координату в текстуре POT это сдвинуть разряды. Умножитель не нужен - уже хлеб. Дальше я думаю если разбираться будет еще больше выгоды.
=A=L=X=
> Да почему не построить то?
Я имел ввиду аппаратно сгенерить и удобно поюзать. Хотя может современные гпу умеют генерить.
Допустим у нас текстура 55*55 пикселей. NPOT текстура с MipLevel 1 будет... либо 27*27 либо 28*28. Если 27*27, то MipLevel 2 будет 13*13... т.е. для каждого mip уровня надо запоминать rect этого уровня чтобы как минимум правильно накладывать его на текстурные координаты. + Интерполяция на box фильтр не ложится, нужно трапезоид уже делать... в общем радости от мипов npot мало. Сплошные проблемы.
MrShoor
> NPOT текстура с MipLevel 1 будет... либо 27*27 либо 28*28. Если 27*27, то MipLevel 2 будет 13*13... т.е. для каждого mip уровня надо запоминать rect этого уровня чтобы как минимум правильно накладывать его на текстурные координаты.
Да не, делают проще, примерно так:
mipWidth = width >> 1; mipHeight = height >> 1;
Тема в архиве.