Когда я должен установить GL_TEXTURE_MIN_FILTER и GL_TEXTURE_MAG_FILTER?

По определению GL_TEXTURE_MIN_FILTER используется, когда текстурируемый пиксель отображается в область, которая больше, чем один элемент текстуры.

Скажем, у меня есть текстура с разрешением 1024 * 768, и я хочу сопоставить ее с прямоугольником. Матрица проекции устанавливается с помощью:

glOrtho(0, 1024, 0, 768, 0, 1);

и прямоугольник устанавливается с помощью:

glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, 0.0f, 0.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(1024.0f, 0.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(1024.0f, 768.0f, 0.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(0.0f, 768.0f, 0.0f);

С текущей конфигурацией, я понимаю, что каждый пиксель в прямоугольнике отображается в один пиксель в текстуре.

Но после теста я узнал MIN_FILTER работает для этой конфигурации. Даже если я удвою размер прямоугольника, а именно 2048 * 1536, и в области просмотра будет отображаться только левый нижний угол, это все равно MIN_FILTER, который работает.

В такой ситуации, по моему личному пониманию, каждый пиксель в окне просмотра отображается в текстуре только на четверть пикселя, почему это все еще MIN_FILTER за работой?

Для проверки того, какой фильтр работает, я просто закомментирую строку для настройки этого фильтра и посмотрю, является ли результат неправильным. Если я закомментирую MIN_FILTER При установке линии результат будет полностью желтым, потому что я не установил максимальный уровень текстуры в соответствии с ее уровнем. Но если я закомментирую MAG_FILTER линия, результат по-прежнему правильный.

7

Решение

Насколько я понимаю, вы комментируете настройку GL_TEXTURE_MIN_FILTER и текстурирование больше не работает. Из этого вы заключаете, что при текстурировании используется фильтр min. И именно этот вывод неверен.

Когда не установлен минимальный фильтр, он не будет волшебным не работа. Вместо этого по умолчанию GL_NEAREST_MIPMAP_LINEAR используется, и поскольку вы не указываете текстурные изображения для других слоев mipmap, это не сработает (я думаю, вы сами догадались). Но это не значит, что результат неправильный, только если минимальный фильтр фактически используется для определенного пикселя. Текстура никогда не будет работать, независимо от того, какой фильтр используется, так как он неполный (то есть использует mipmapping, в то же время не имея действительных изображений для каждого уровня mipmap). Так что это не сработает и для mag-фильтрации. Это не фильтр, который сломан, это вся текстура.

С другой стороны GL_TEXTURE_MAG_FILTER не имеет режимов mipmapping и когда вы не устанавливаете его, он использует по умолчанию GL_LINEAR, Таким образом, текстура всегда завершена и работает, независимо от того, установлен ли mag-фильтр или нет.

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

Итак, сделаем вывод:

  1. Вам не нужно устанавливать фильтры min и mag для текстурного объекта. Если вы этого не сделаете, они будут использовать значения по умолчанию. Но по умолчанию min-фильтр использует mipmapping и требует, чтобы вы указывали изображения для каждого уровня mipmap, в противном случае текстура будет неполной (т.е. не будет работать), независимо от того, какой фильтр используется для определенного фрагмента.

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

  3. Когда размер пикселя точно (что такое «именно так» в любом случае в этом контексте?) соответствует размеру текселя, трудно сказать, какой из двух режимов фильтрации используется, но нет простого способа проверить, какой из них используется для определенного фрагмента. Но если вам все равно нужно идеальное текстурирование (например, просто для рисования растрового изображения на 2D-экране), используйте GL_NEAREST для фильтров min и mag это, вероятно, лучшая идея, которая в любом случае освобождает вас от мысли о том, какой фильтр действительно используется.

11

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector