Сколько мипмапов у текстуры в OpenGL - PullRequest
17 голосов
/ 05 марта 2012

Не говоря уже о том, что именно я создал текстуру в первую очередь, и я должен прекрасно знать, сколько mipmaps я загрузил / сгенерировал для нее. Я делаю это для модульного теста. Кажется, нет параметра glGetTexParameter, чтобы это выяснить. Самое близкое, что я пришел - что-то вроде этого:

int max_level;
glGetTexParameter( GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, &max_level );
int max_mipmap = -1;
for ( int i = 0; i < max_level; ++i )
{
    int width;
    glGetTexLevelParameter( GL_TEXTURE_2D, i, GL_TEXTURE_WIDTH, &width );
    if ( 0 == width )
    {
        max_mipmap = i-1;
        break;
    }
)

В любом случае, glGetTexLevelParameter() вернет 0 ширины для несуществующего mipmap, если я использую графический процессор NVidia, но с Mesa он возвращает GL_INVALID_VALUE, что заставляет меня поверить, что это Неверно Что нужно сделать .

Как узнать, с какими уровнями mipmap я заполнил текстуру?

Ответы [ 3 ]

10 голосов
/ 05 марта 2012

Спецификация на этом не совсем понятна.В нем говорится, что вы получите GL_INVALID_VALUE, если параметр уровня «больше максимально допустимого уровня детализации».Точно, как это определено, не указано.

Документация для функции немного уточняет, говоря, что это максимально возможное количество LOD для максимально возможной текстуры (GL_MAX_TEXTURE_SIZE).Другие подобные функции, такие как glFramebufferTexture, явно указывают это как предел для GL_INVALID_VALUE.Так что я бы ожидал этого.

Поэтому в Mesa есть ошибка.Однако вы можете обойти это, предполагая, что ошибка 0 или GL_INVALID_VALUE означает, что вы вышли из конца массива mipmap.

При этом я бы предложил использовать glTexStorage и никогда больше не нужно задавать вопрос.Это принудительно не позволит кому-либо установить MAX_LEVEL в слишком большое значение.Он довольно новый, от GL 4.2, но он реализован (или будет очень скоро) на всех аппаратных средствах не от Intel, которые все еще поддерживаются.

8 голосов
/ 03 сентября 2014

Похоже, что в настоящее время нет способа узнать, сколько уровней текстуры у mipmap, если не считать проб / ошибок OPs с помощью проверки недопустимого значения @NicolBolas.В большинстве случаев я думаю, что его производительность не будет иметь значения, если размер уровня 0 не будет часто меняться.

Однако, если предположить, что текстура не имеет ограниченного количества уровней , спецификацииприведите предпочтительный расчет (обратите внимание на использование floor, а , а не ceiling, как показывают некоторые примеры):

numLevels = 1 + floor(log2(max(w, h, d)))

Каково правило уменьшения размеров для каждого последовательно меньшего уровня мипмапа?

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

[ARB_texture_non_power_of_two]

Этоконечно, можно проверить методом OPs или в моем случае, когда я получил GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT с glFramebufferTexture2D(..., numLevels).

0 голосов
/ 25 марта 2012

Предполагая, что вы строите мип-карты стандартным способом, количество уникальных изображений будет примерно таким, как ceil (log_2 (max (width, height))) + 1.Это можно легко получить, заметив, что мип-карты каждый раз уменьшают размер изображения в два раза, пока не будет одного пикселя.

...