2010-10-11 4 views
2

В настоящее время я работаю над реализацией виртуальной текстуры. Уровни mipmap используются как уровень структуры управления деталями. (Каждый тексел в виртуальной текстуре относится к блоку данных в «реальной» текстуре.)Можно ли использовать пользовательские размеры mipmap?

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

Пример:

level  size of data  number of blocks 
0   60     4 
1   30     2 
2   15     1 

Моя идея состояла в том, чтобы назвать glTexImage для каждого уровня детализации в виртуальной текстуры для создания различных уровней MIPMAP.

Проблема в том, что при создании или обновлении/загрузке ошибок нет, я не могу получить никаких данных из текстуры. Создание только базового уровня и вызов glGenerateMipmap отлично работает, но приводит к неправильным размерам для некоторых базовых размеров. (технически они правильные, но не в моем случае)

Я где-то читал, что размеры уровня mipmap должны быть делением на два (или на два и пол).

Вопросы:

  • Можно ли загружать уровни "заказные MIPMAP?
  • Есть ли ограничения уровня mipmap уровня?
+0

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

ответ

5

Вы можете загрузить пользовательские уровни mipmap, но не можете выбрать их размеры. OpenGL определяет размеры MipMap для ожидаемых уровней и не позволяет отклоняться от него.

Взяв ширину в качестве примера, требуемая ширина для уровня mipmap i равна max(1, floor(w_b/2^i)), где w_b - ширина первого уровня mip (базового). Это то же самое для других измерений (GL spec 2.1, раздел 3.8.8, mipmapping).

+0

Я просто (повторно) прочитал спецификацию ARB_texture_non_power_of_two. В нем говорится: «Обратите внимание, что это расширение совместимо с поддержкой других правил округления, поскольку оно просто ослабляет условия ошибки и полноты для mipmaps». Исходя из этого, я бы сказал, что округление на любую сторону должно быть возможным. – fho

+0

@Florian, то, что вы читаете, просто говорит, что расширение было написано специально, чтобы не препятствовать дальнейшим расширениям. Но полная страница перед этим объясняет, почему был выбран _floor_ (прочитайте первый абзац этой проблемы). Часть спецификации (а не список проблем) содержит только пол в качестве формулы. – Bahbar

+0

ok ...чем я должен повторить некоторые вещи ... * вздох * – fho

0

Убедитесь, что вы загрузили уровни mipmap вплоть до 1x1. См. here.

+0

Просто попробовал это ... но тем не менее это дает мне пустой экран. Размеры Mipmap, генерируемые glGenerateMipmaps: (26, 32, 16), (13, 16, 8), (6, 8, 4), (3, 4, 2), (1, 2, 1), (1 , 1, 1) Размеры Mipmap, генерируемые мной: (26, 32, 16), (13, 16, 8), (7, 8, 4), (4, 4, 2), (2, 2, 1), (1, 1, 1) Обратите внимание, что в некоторых случаях мне нужно округлить. Это из-за исходных данных. – fho

+0

Исходный набор данных: 406,512,256; 203,256,128; 101,128,64; 50,64,32; 25,32,16; 12,16,8; 6,8,4; 3,4,2; 1,2,1 ; 1,1,1 Это правильные размеры разделов и пола. Но деление на блокизацию приводит к некоторому случайному округлению:/ – fho